问题 问答题

下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun()的功能是:将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并作为函数值返回。
和值通过函数值返回main()函数。例如,若n=5,则应输出8.391667。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
[试题源程序]
#include<stdio.h>
#include<stdlib.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(sizeof(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->next,而不是把头指针h的下一个结点赋给p,因为这样会造成死循环。所以p=h->next,应该改为p=p->next。

填空题
单项选择题 A1型题