问答题 给定程序中,函数fun的功能是将带头结点的单向链表逆置,即若原链表中从头至尾结点数据域依次为2、4、6、8、10,逆置后,从头至尾结点数据域依次为10、8、6、4、2。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构! 试题程序: #include < stdio.h > #include < stdlib.h > #define N 5 typedef struct node{ int data; struct node*next; }NODE; void fun(NODE*h) { NODE *P, *q, *r; /*********found*********/ p=h一 > 【1】 ; /*********found*********/ if(p== 【2】 )return; q=p一 >next; p一 >next =NULL; while(q) {r=q一 >next;q一 >next=p; /*********found*********/ p=q; q= 【3】 ; } h一 >next=P; } NODE*creatlist(int a[]) { NODE*h,*p,*q;int i; h=(NODE*)malloc(sizeof(NODE)); h一 >next=NULL; for(i=0;i < N;i++) { q=(NODE*)malloc(sizeof (NODE)); q一 >data=a[i], q一 >next=NULL; if(h一 >next==NULL) h一 >next=p=q; else{p一 >next=q;p=q;) } return h; } void outlist(NODE*h) { NODE*p; P=h一 >next; if(P==NULL) printf("The list is NULL!/n"); elSe {printi("/nttead"); do fprintf("一 >%d",p一 >data); p=p一 >next;) while(P!=NULL); printf("一 >End/n"); } } main () { NODE *head; int a[N] = {2,4,6,8 , 10 } ; head = creatlist (a) ; printf ( "/ nThe original outlist (head) ; fun (head) ; printf ( "/nThe list after inverting :/n"); outlist (head) ; }
【正确答案】正确答案:(1)next (2)NULL (3)r
【答案解析】解析:填空1:本空考查了为p赋初值,根据题目的要求是将带头结点的单向链表逆置可知,p的初值应该为h一> next。 填空2:if判断语句表明当p等于什么时就要返回,因此只能当p等于NULL时返回,不用做后面的链表的逆置了。 填空3:把q的指针向后移动,才能实现将带头结点的单向链表逆置。因此本空填写r。