在给定程序中,函数fun的功能是:将不带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为:10、8、6、4、2。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构。
文件BLANK1.C内容如下:
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node
int data;
struct node *next;
NODE;
/**********found**********/
(1) fun(NODE *h)
NODE *p,*q,*r;
p=h;
if(p==NULL)return NULL;
q=p->next:
p->next=NULL;
/**********found**********/
while( (2) )
r=q->next;
q->next=p;
p=q;
/**********found**********/
q= (3) ;
return p;
NODE *creatlist(int a[]) NODEh,*p,*q;
int i;
h=NULL;
for(i=0;i<N;i++)
q=(NODE%)malloc(sizeof(NODE));
q->data=a[i];
q->next=NULL;
if(h==NULL)h=p=q;
else p->next=q;p=q;
return h;
void outlist(NODE *h)
NODE *p;
p=h;
if(p==NULL)printf("The list is NULL!\n");
else
printf("\nHead");
do
printf("->%d",p->data);
p=p->next;
while(p!=NULL);
printf("->End\n");
void main( )
NODE *head;
int a[N]=2,4,6,8,10;
head=creatlist(a):
printf("\nThe original list: \n");
outlist(head);
head=fun(head);
printf("\nThe list after inverting: \n");
outlist(head);
参考答案:r
解析: 程序在开头用typedef定义了一个结构体类型NODE。程序由4个函数构成,其中fun函数实现链表的逆置,creatlist函数的功能是创建一个链表,outlist函数的功能是输出链表的值。在main函数中,首先调用creatlist函数创建了一个链表,调用outlist对此链表进行了输出;然后调用fun函数对链表进行逆置,最后再一次调用outlist函数输出逆置后的结果。
函数fun实现了链表的逆置。由于需要返回链表第一结点的地址,而且每个结点都是一个结构体变量,所以第1空处应填入NODE*,正确定义函数fun的类型。由于该链表不带头结点,所以在fun函数中,执行“p=h;”后,指针p指向链表的第一个结点,并通过if语句对p是否为空进行判定,如果是,则说明链表是空链表,直接返回;如果链表不是空链表,则通过“q=p->next;”语句,令指针q指向p的后一个结点。由于链表要逆置,p指向的结点一定是逆置后链表的最后一个结点,所以对p->next置为NULL。此时,p指向的是新链表的最后一个结点,而q指向的原链表中需要处理的结点,所以第2空处应填入while的循环条件,即“q!=NULL”。在循环中,首先令指针r指向q的下一个结点,再利用语句“q->next=p;”使q所指结点成为p所指结点的前一结点;语句“p=q;”的作用是修改p的指向,确保p始终指向新链表的第一个结点,最后要让q指向原链表中下一个处理的结点,必须执行“q=r;”的操作,所以第3空处应填入r。循环结束后,新链表的第一个结点地址存放在指针p中,所以最后将p的值作为函数值返回。