循环双链表

来源:互联网 发布:招银网络科技 知乎 编辑:程序博客网 时间: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;}