如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第九章9.4用指针处理链表zhang3353108#2548#2548#2548#9.4.2建立简单的静态链表链表实现:链表结点数据可用结构体来描述#defineNULL0structstudent{longnum;floatscore;structstudent*next};structstudenta,b,c,*head;a.num=99101;a.score=89.5;b.num=99102;b.score=90;c.num=99103;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;structNODE{intnum;structNODE*next;};main(){structNODEs[3]={{1,'\0'},{2,'\0'},{3,'\0'}},*p,*q,*r;intsum=0;s[0].next=s+1;s[1].next=s+2;s[2].next=s;p=s;q=p->next;r=q->next;sum+=q->next->num;sum+=r->next->next->num;printf("%d\n",sum);}9.4.3建立动态链表free函数函数原型:voidfree(void*ptr);作用:释放由指针ptr指向的内存区。p是最近一次调用malloc或calloc的返回值。函数返回值:无【例】动态定义数组。假定建立了以下链表结构,指针p、q分别指向如图所示的结点,则以下可以将q所指结点从链表中删除并释放该结点的语句组是A)free(q);p->next=q->next;B)(*p).next=(*q).next;free(q);C)q=(*q).next;(*p).next=q;free(q);D)q=q->next;p->next=q;p=p->next;free(p);练2增加结点:删除结点:10.4.4应用举例说明:程序由三个函数组成。主函数;new_record函数,用来新增加一个结点;listall函数,用来打印输出已有的全部结点中的数据。程序开始运行时若键入“E”或“e”则表示要进行增加新结点的操作,若键入“L”,或“l”,表示要输出所有结点中数据。输入其他字符则结束程序。main(){charch;intflag=1;head=NULL;/*链表开始是空的*/while(flag){printf(“\ntype’E’or’e’toenternewrecord,”);ch=getchar();switch(ch){case‘e’:case‘E’:new_record();break;/*新增加一个结点*/case‘l’:case‘L’:listall();break;/*打印已有的全部结点中的数据*/default:flag=0;/*退出循环,结束程序*/}}}1.建立动态链表new_record函数在第一次调用new_record函数时,head的值为NULL,此时应将新结点链接在head之后,令head=new,就是将新结点的地址赋给head,使head指向新结点。接着执行this=new,使this指向当前插入的结点。接着向新结点输入数据。最后使this→next为NULL,即使这个结点不再指向其它结点。第二次键入了“e”或”E”,进入new_record函数时,再开辟一个新结点。this=head的作用是使this指向第一个结点,然后在while循环中判断this→next的值是否为NULL,如果是NULL,表示新结点就加在第一个结点之后,执行this→next=new,即把新结点的地址赋给this所指的结点中的next项,也就是将新结点链接在this所指的结点之后。然后再将new的值赋给this,即this也指向new的结点,再输入第二个结点的数据,并使thisnext为“空”,再增加一个新结点,先用malloc函数开辟新结点。使this指向第一结点。接着执行while循环体this=this→next,它的作用是使this后移一个结点,this由原来指向第一个结点改为指向第二个结点了。此时,this→next值已是NULL了,不再执行循环体。如果原有结点数较多,则while循环使this一次一次地后移直到指向最后一个结点(此时this→next值为NULL)为止。接着执行this→next=new,把新结点链入最后一个结点之后,然后使this指向新结点,输入数据给新结点,最后使this→next为NULL。head使this指向第一个结点voidnew_record(void){charnumstr[20];