问答题 给定程序中,函数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 {printf("\nttead"); do {printf("->%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 list:\n"); 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。