问答题
[说明]
本程序包含的函数及其功能说明如下:
(1)函数first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元;
(2)函数reverse_copy()的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与
已知链表的表元链接顺序相反;
(3)函数Print_link()用来输出链表中各表元的值;
(4)函数free_link()用来释放链表全部表元空间。
[程序]
#include <stdio. h >
#include <malloe. h >
typodef struct node
int val;
struct node * next;
NODE;
void first_insert(NODE * * p,int v)
NODE *q = (NODE *) malloe(sizeof(NODE));
q->val = v; q->next = *p; /* 为新表元赋值*/
* p = (1) ;
NODE * reverse_copy( NODE * p)
NODE * u;
for(u=NULL; p!=NULL; p=p->next) first_insert( (2) );
return u;
void printlink(NODE * p )
for(; (3) ) prinff("%d/t", p->val);
printf(" /n");
void free_link( NODE * p)
NODE * u;
while(p! =NULL) u=p->next;free(p); (4) ;
void main( ) NODE * link1 , * link2;
int i;
link1 = NULL;
for(i=1; i<= 10; i+ + )first_insert(&linkl, i);
link2 = reverse_copy(link1 );
(5) ;
free_link( linkl ) ;free_link(link2);
【正确答案】(1)q (2)&u,p->val (3)p!=NULL;P= p->next (4)P=u (5)print_link(link2)
【答案解析】定义新表元并且给予赋值后需要更新链首指针,使其指向新表元;
(2)为了由空链表生成原来链表的逆序链,可以自链首表元P起遍历其每一个表元,调用first_insert函数将这个表元的值插入到新链表u中;
(3)此处的循环是自链首表元p起循环遣历链表,循环结束条件是p!=NULL,每循环一次,将p指向下一个表元,即P=P->next;
(4)释放链表全部表元空间是自链首表元起,循环释放每一个表元空间;
(5)此处定义了程序的输出。由于main函数中链表 link1、link2分别为:
“10 9 8 7 6 5 4 3 2 1”及
“1 2 3 4 5 6 7 8 9 10”,
因而此处应该是调用print_link函数输出link2。