问题 问答题

下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun()的功能是:将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并作为函数值返回。

其累加和通过函数值返回main()函数。例如,若n=5,则应输出8.391667。

请改正程序中的错误,使它能得到正确结果。

[注意] 不要改动main函数,不得增行或删行,也不得更改程序的结构。

[试题源程序]

#include<stdio.h>

#include<stdiib.h>

typedef struct aa

int data;

struct aa *next;

NODE;

int fun(NODE *h)

int sum=0;

NODE *P;

/**********found**********/

p=h;

while(P->next)

if(p->data%2==0)

sum+=p->data;

/**********found**********/

p=h->next;

return sum;

NODE *creatlink(int n)

NODE *h, *p, *s, *q;

int i, x;

h=p=(NODE *)malloc(si zeof(NODE));

for(i=1; i<=n; i++)

s=(NODE *)malloc(sizeof(NODE));

s->data=rand()%16;

s->next=p->next;

p->next=s;

p=p->next;

p->next=NULL;

return h;

outlink(NODE *h, FILE *Pf)

NODE *p;

p=h->next;

fprintf(Pf, "\n\nTHE LIST:\n\n HEAD");

while(P)

fprintf(Pf, "->%d", p->data); p=p->next;

fprintf(pf, "\n");

outresult(int s, FILE *pf)

fprintf(Pf, "\nThe sum of even numbers : %d\n", s);

main()

NODE *head; int even;

head=creatlink(12);

head->data=9000;

outlink(head, stdout);

even=fun(head);

printf("\nThe result :\n"); outresult(even, stdout);

答案

参考答案:

(1)错误:while(p->next)

正确:while(p!=NULL)或while(p)

(2)错误:p=h->next;

正确:p=p->next;

解析:

错误1:循环时要注意循环中止的条件是p!=NULL(最后一个结点为空,就像字符串的最后一个字符为结尾标志符’\0’一样),while(p->next)使循环提前结束,所以应改为while(p!=NULL)或while(p)。

错误2:当累加完后,应该把指针指向下一个结点的指针赋给p,而不是把头指针指向的下一个结点赋给p,否则还会造成死循环,所以p=h->next;应该改为p=p->next;。

单项选择题
填空题