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->datanext=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->datadata)
p=p->next;
if(p->next==list->last&&p->next->datadata){
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。