C语言实现的循环单链表功能示例
本文实例讲述了C语言实现的循环单链表功能。分享给大家供大家参考,具体如下:
SClist.h
#ifndef__SCLIST_H__ #define__SCLIST_H__ #include#include #include typedefintElemType; typedefstructNode{ ElemTypedata; structNode*next; }Node,*PNode; typedefstructList{ PNodefirst; PNodelast; size_tsize; }List; voidInitSClist(List*list);//初始化循环单链表 voidpush_back(List*list,ElemTypex);//在循环单链表的末尾插入元素 voidpush_front(List*list,ElemTypex);//在循环单链表的头部插入元素 voidshow_list(List*list);//打印循环单链表 voidpop_back(List*list);//删除循环单链表的最后一个元素 voidpop_front(List*list);//删除循环单链表的第一个元素 voidinsert_val(List*list,ElemTypeval);//将数据元素插入到循环单链表中(要求此时循环单链表中的数据元素顺序排列) Node*find(List*list,ElemTypex);//查找循环单链表中数据值为x的结点 intlength(List*list);//求循环单链表的长度 voiddelete_val(List*list,ElemTypex);//按值删除循环单链表中的某个数据元素 voidsort(List*list);//对循环单链表进行排序 voidreverse(List*list);//逆置循环单链表 voidclear(List*list);//清除循环单链表 voiddestroy(List*list);//摧毁循环单链表 //优化 Node*_buynode(ElemTypex);//创建结点 #endif
SClist.cpp
#include"SClist.h" Node*_buynode(ElemTypex){ Node*s=(Node*)malloc(sizeof(Node)); assert(s!=NULL); s->data=x; s->next=NULL; returns; } voidInitSClist(List*list){ Node*s=(Node*)malloc(sizeof(Node)); assert(s!=NULL); list->first=list->last=s; list->last->next=list->first;//让链表最后一个结点的指针域指向头结点,从而时链表循环 list->size=0; } voidpush_back(List*list,ElemTypex){ Node*s=_buynode(x); list->last->next=s; list->last=s; list->last->next=list->first; list->size++; } voidpush_front(List*list,ElemTypex){ Node*s=_buynode(x); s->next=list->first->next; list->first->next=s; if(list->last==list->first) list->last=s; list->size++; } voidshow_list(List*list){ Node*p=list->first->next; while(p!=list->first){ printf("%d->",p->data); p=p->next; } printf("Nul.\n"); } voidpop_back(List*list){ if(list->size==0)return; Node*p=list->first; while(p->next!=list->last) p=p->next; free(list->last); list->last=p; list->last->next=list->first; list->size--; } voidpop_front(List*list){ if(list->size==0)return; Node*p=list->first->next; list->first->next=p->next; if(list->size==1) list->last=list->first; free(p); list->size--; } voidinsert_val(List*list,ElemTypex){ Node*p=list->first; while(p->next!=list->last&&p->next->datanext; if(p->next==list->last&&p->next->data next=p->next; p->next=s; list->size++; } } Node*find(List*list,ElemTypekey){ if(list->size==0)returnNULL; Node*p=list->first->next; while(p!=list->first&&p->data!=key) p=p->next; if(p==list->first) returnNULL; returnp; } intlength(List*list){ returnlist->size; } voiddelete_val(List*list,ElemTypex){ if(list->size==0)return; Node*p=find(list,x); if(p==NULL){ printf("没有要删除的数据!\n"); return; } if(p==list->last) pop_back(list); else{ Node*q=p->next; p->data=q->data; p->next=q->next; free(q); list->size--; } } voidsort(List*list){ if(list->size==0||list->size==1)return; Node*s=list->first->next; Node*q=s->next; list->last->next=NULL; list->last=s; list->last->next=list->first; while(q!=NULL){ s=q; q=q->next; Node*p=list->first; while(p->next!=list->last&&p->next->data data) p=p->next; if(p->next==list->last&&p->next->data data){ list->last->next=s; list->last=s; list->last->next=list->first; } else{ s->next=p->next; p->next=s; } } } voidreverse(List*list){ if(list->size==0||list->size==1)return; Node*p=list->first->next; Node*q=p->next; list->last->next=NULL; list->last=p; list->last->next=list->first; while(q!=NULL){ p=q; q=q->next; p->next=list->first->next; list->first->next=p; } } voidclear(List*list){ Node*p=list->first->next; while(p!=list->first){ list->first->next=p->next; free(p); p=list->first->next; } list->last=list->first; list->last->next=list->first; list->size=0; } voiddestroy(List*list){ clear(list); free(list->first); list->first=list->last=NULL; }
main.cpp
#include"SClist.h" voidmain(){ Listmylist; InitSClist(&mylist); ElemTypeitem; Node*p=NULL; intselect=1; while(select){ printf("*******************************************\n"); printf("*[1]push_back[2]push_front*\n"); printf("*[3]show_list[4]pop_back*\n"); printf("*[5]pop_front[6]insert_val*\n"); printf("*[7]find[8]length*\n"); printf("*[9]delete_val[10]sort*\n"); printf("*[11]reverse[12]clear*\n"); printf("*[13*]destroy[0]quit_system*\n"); printf("*******************************************\n"); printf("请选择:>>"); scanf("%d",&select); if(select==0)break; switch(select){ case1: printf("请输入要插入的数据(-1结束):>"); while(scanf("%d",&item),item!=-1){ push_back(&mylist,item); } break; case2: printf("请输入要插入的数据(-1结束):>"); while(scanf("%d",&item),item!=-1){ push_front(&mylist,item); } break; case3: show_list(&mylist); break; case4: pop_back(&mylist); break; case5: pop_front(&mylist); break; case6: printf("请输入要插入的数据:>"); scanf("%d",&item); insert_val(&mylist,item); break; case7: printf("请输入要查找的数据:>"); scanf("%d",&item); p=find(&mylist,item); if(p==NULL) printf("要查找的数据在单链表中不存在!\n"); break; case8: printf("单链表的长度为%d\n",length(&mylist)); break; case9: printf("请输入要删除的值:>"); scanf("%d",&item); delete_val(&mylist,item); break; case10: sort(&mylist); break; case11: reverse(&mylist); break; case12: clear(&mylist); break; //case13: //destroy(&mylist); //break; default: printf("选择错误,请重新选择!\n"); break; } } destroy(&mylist); }
希望本文所述对大家C语言程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。