数据结构-C语言实现-双向循环链表

时间:2020-05-21
本文章向大家介绍数据结构-C语言实现-双向循环链表,主要包括数据结构-C语言实现-双向循环链表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<ctype.h>
  5 #define NAME 20
  6 #define SEX 6
  7 typedef struct item{
  8   char *name;
  9   char *sex;
 10   int age;
 11   struct item * front;//前驱,指向上一个结点
 12   struct item *rear;//后继,指向下一个结点
 13 }ITEM;
 14 ITEM * initList(){//返回一个初始化的头结点
 15   ITEM * list=(ITEM *)malloc(sizeof(ITEM));
 16   list->front=list->rear=NULL;//头结点初始化时前驱和后继为空
 17   return list;
 18 }
 19 char * GetName(){
 20   char *p=(char *)malloc(sizeof(char)*NAME);
 21   printf("请输入名字:");
 22   scanf("%s",p);
 23   printf("GetName\n");
 24   return p;
 25 }
 26 char * GetSex(){
 27   char *p=(char *)malloc(sizeof(char)*SEX);
 28   printf("请输入性别:");
 29   scanf("%s",p);
 30   printf("GetSex\n");
 31   return p;
 32 }
 33 int GetAge(){
 34   int age;
 35   printf("请输入年龄:");
 36   scanf("%d",&age);
 37   printf("GetAge\n");
 38   return age;
 39 }
 40 void menu(){
 41   printf("键入以下选项来操作,ctrl+z以退出!\nA:添加数据\nB:打印列表\nC:按名插入数据\nD:按名删除数据\nE:按名查找详细信息\n");
 42 }
 43 void AddITEM(ITEM *p,char *name,char *sex,int age){
 44   ITEM * item=(ITEM *)malloc(sizeof(ITEM));
 45   ITEM *head=p;
 46   item->name=name;
 47   item->sex=sex;
 48   item->age=age;
 49   item->rear=NULL;
 50   if(!p->front&&!p->rear){//如果添加的是第一个结点
 51     p->rear=item;//头结点的后继指向第一个节点
 52     p->front=item;//头结点的前驱指向第一个节点
 53     item->front=p;//第一个结点的前驱指向头结点
 54     printf("frist!\n");
 55   }
 56   else{
 57     head->front->rear=item;//最后一个结点的后继指向新结点
 58     item->front=head->front;//新结点前驱指针指向最后一个结点
 59     head->front=item;//更新头结点的前驱(总是指向最后一个结点)
 60     printf("second!\n");
 61   }
 62   printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age);
 63 }
 64 void ShowList(ITEM *p){
 65   while(p->rear){
 66     printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age);
 67     p=p->rear;
 68   }
 69 }
 70 void InsertITEM(ITEM *p){
 71   printf("请输入要插入在哪个目标后面:\n");
 72   char *pos=GetName();
 73   ITEM *target=(ITEM *)malloc(sizeof(ITEM));//新结点
 74   printf("请输入要插入的信息:\n");
 75   char *target_name=GetName();
 76   char *target_sex=GetSex();
 77   int target_age=GetAge();
 78   printf("c!\n");
 79   target->name=target_name;
 80   target->sex=target_sex;
 81   target->age=target_age;
 82   while(p->rear){
 83     if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点
 84       target->rear=p->rear->rear;//新结点后继指向要插入结点后的后继
 85       p->rear->rear=target;//目标位置结点的后继指向新结点
 86       target->front=p->rear;//新结点的前驱指向该位置
 87       return;
 88     }
 89     else
 90     p=p->rear;
 91   }
 92 }
 93 void DeleITEM(ITEM *p){
 94   printf("请输入要删除的目标姓名:\n");
 95   char *pos=GetName();
 96   while(p->rear){
 97     if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点
 98       if(p->rear->rear!=NULL){//如果要删除的结点不为最后一个结点
 99         ITEM *ptr=p->rear->rear;//指向目标结点的后继结点
100         ptr->front=p;//目标结点的后继结点的前驱结点为目标节点的前驱即p
101         free(p->rear);
102         p->rear=ptr;//目标结点的前驱的后继指向目标结点的后继
103       }
104       else{
105         free(p->rear);//直接释放
106         p->rear=NULL;//指向该结点置为空
107       }
108     }
109     else
110     p=p->rear;
111   }
112 }
113 void ShowSB(ITEM *p){
114   printf("请输入目标信息:\n");
115   char *pos=GetName();
116   while(p->rear){
117     if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点
118       printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age);
119       return;
120     }
121     else
122     p=p->rear;
123   }
124 }
125 void main(){
126   ITEM *head=initList();//指向头结点
127   char ch;
128   menu();
129   while((ch=getchar())!=EOF){
130     setbuf(stdin,NULL);
131     switch (toupper(ch)){
132       case 'A': AddITEM(head,GetName(),GetSex(),GetAge());break;
133       case 'B': ShowList(head);break;
134       case 'C': InsertITEM(head);break;
135       case 'D': DeleITEM(head);break;
136       case 'E': ShowSB(head);break;
137     }
138   menu();
139   setbuf(stdin,NULL);
140   }
141 }

原文地址:https://www.cnblogs.com/Let-us-Coding/p/12932257.html