- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.1循环链表 (Circular List) 特点:最后一个结点的 next 指针不为NULL,而是指向头结点。只要已知表中某一结点的地址,就可搜寻所有结点的地址。 存储结构:链式存储结构 带表头结点的循环链表: link creat_clist(link head) {link new,p; int c; head=(link)malloc(sizeof(node)); if(head==NULL) printf(“内存分配失败\n”); else {printf(“请输入结点数据:”\n); scanf(“%d”,c); head-data=c; head-next=NULL; p=head; while(1) {new=(link)malloc(sizeof(node)); printf (“请输入结点数据:”\n); scanf(“%d”,c); if(c!=-1) {new-data=c; p-next=new; p=new;} else {printf(“\n”); p-next=head; break;} } } return head; } 循环链表的输出: (1)先将指针指向第一个结点,将p结点的数据输出。 (2)再将p指向下一个结点,将数据输出,重复执行这一步,直到p结点等于head为止。 link print_clist(link head) {link p; p=head; printf(“您输入的循环链表是:\n”); do{printf(“[%d]”,p-data); p=p-next; }while(p!=head); printf(“\n”); } 需采用这种do~while循环,如果用while循环,将不能执行 循环链表的释放: 如果还使用单链表的算法,将出现死循环,将算法改动如下: 方法一:(将循环链表改为单链表再释放) (1)将指针p指向首结点的下一个结点,即第二个结点。(假设没有头结点) (2)将首结点的next域设成NULL (3)使用单链表的释放算法进行释放,这时的链表是以p为首结点的 方法二:(从循环链表的第二个结点开始释放) (1)将p指向首结点的指针所指向的结点,即第二个结点 (2)依次释放下一个结点,直到结点是首结点为止。最后再释放首结点。 void free_clist(link head) {link p,next; next=head-next; while(next!=head) {p=next; next=next-next; free(p);} free(head); } 二、循环链表结点的插入 三种情况:(1)插入在循环链表首结点之前。 (2)插入在循环表的中间 (3)插入在循环链表的表尾 算法思想: (1)声明一个新结点供用户输入新结点内容 (2)用户输入一个结点内容,表示欲插入在哪个结点之后 (3)找到该结点p,内容等于key或NULL(找不到该结点) (4)如果找到,则: new-next=p-next; p-next=new; 如果没找到,则: new-next=head; tail-next=new; head=new; link insert_clist(link head,link new,int key) {link p; p=head; while(1) {if(p-data==key) {new-next=p-next; p-next=new; break;} if(p-data!=keyp-next==head)//没找到 {new-next=p-next; p-next=new; head=new; break;} p=p-next;//向后搜索 } return head;} 三、循环链表结点的删除 (1)删除首结点 (2) 删除循环链表中间的结点 (3)删除循环链表尾端的结点 算法思想: (1)依次找到欲删除结点p (2)如果找不到该结点,输出提示 (3)如果找到,且是首结点,则必须找到尾结点tail head=p-next; ta
文档评论(0)