循环双链表
来源:互联网 发布:招银网络科技 知乎 编辑:程序博客网 时间:2024/05/18 00:52
#include<stdio.h>#include<stdlib.h>typedef struct node{int data; struct node*next,*prior;}Snode;Snode* creat()//创建头结点{int n,i,x; Snode *head,*s,*t; head=(Snode*)malloc(sizeof(Snode));head->next=NULL;head->prior=NULL;t=head;printf("请输入要插入的结点数:\n"); scanf("%d",&n); if(n!=0) { printf("请输入%d个结点数的值\n",n); for(i=0;i<n;i++) { scanf("%d",&x); s=(Snode*)malloc(sizeof(Snode)); s->data=x; s->next=t->next; s->prior=t; t->next=s; t=s; } t->next=head; head->prior=t;//如果是循环链表。这里在双链表的基础上加上这两句代码就OK } return head;}int lenth(Snode *l)//求链表的长度{ int len=0;Snode *s=l;while(s->next!=l)//在求长度的时候,只要不等于头结点,表示结束{len++;s=s->next;}return len;}Snode *get(Snode *l,int i)//取单链表表中第i个结点地址{ int len=0; Snode *s=l;while(s->next!=l&&len!=i)//同上面求长度的{len++;s=s->next;}return s;}void insnode(Snode *l,int i,int x)//把x的值插入到指定的位置i{ Snode *s,*t; if(i<=lenth(l)) { s=(Snode*)malloc(sizeof(Snode)); s->data=x; t=get(l,i-1); s->next=t->next; s->prior=t; t->next->prior=s; t->next=s; } else printf("链表中没有第%d个位置\n",i);}void delnode(Snode *l,int i)//删除指定位置i的结点{ Snode *s,*t; if(i<=lenth(l)) { t=get(l,i-1); s=t->next; t->next=s->next; s->next->prior=t;//因为是循环链表,这里就没必要加判断条件,如果是双链表的话必须加free(s); } else printf("链表中没有第%d个位置\n",i);}int locate(Snode *l,int x)//按值查找{ int flag=-1; Snode *s=l; while(s->next!=l)//同样这里一样要改{if(s->data==x){flag=1;break;}else s=s->next;} return flag;}void display(Snode *l)//显示链表{ Snode *s=l->next; while(s!=l)//同样这里也要改 { printf("%d ",s->data); s=s->next; } printf("\n");}int main(){Snode *s; int i,x; char c; while(1) { printf("************************\n"); printf("* *\n"); printf("* 1 链表初始化 *\n"); printf("* 2 链表指定插入 *\n"); printf("* 3 链表指定删除 *\n"); printf("* 4 链表按值查询 *\n"); printf("* 5 退出 *\n"); printf("************************\n"); c=getchar(); if(c=='5')break; else switch(c) { case '1':s=creat();; printf("初始化后的链表:\n"); display(s);break; case '2':printf("请输入要插入的位置和值\n"); scanf("%d%d",&i,&x); insnode(s,i,x); printf("插入指定位置值后的链表:\n"); display(s); break; case '3':printf("请输入要删除的位置\n"); scanf("%d",&i); delnode(s,i); printf("删除指定位置值后的链表:\n"); display(s); break; case '4':printf("请输入要按值查询的值\n"); scanf("%d",&x); if(locate(s,x)!=-1) printf("在链表中查到了\n"); else printf("没有查到\n"); break; } getchar();}return 0;}