双向循环链表

匿名 (未验证) 提交于 2019-12-02 23:40:02

这是我做的一个简单的双向循环链表。

在双向循环链表当中最重要的是对四个指针的控制,其它地方与之前学的无异。

  1 #include<stdio.h>   2 #include<stdlib.h>   3 typedef int DataType;   4 //链表结点    5 typedef struct node{   6     DataType data;   7     struct node *front;   8     struct node *next;    9 }LinkList;  10 //初始化双向链表  11 int IntList(LinkList *L){  12     L=(LinkList*)malloc(sizeof(LinkList));  13     L->front=L->next=L;  14     L->data=0;  15 }   16 //输入双向链表的值(尾插法)  17 int InputList(LinkList *L){  18     LinkList *NewNode,*p;  19     p=L;  20     int length,data;  21     printf("请输入想要创建链表的长度:");    22     scanf("%d",&length);    23     for(int i=0; i<length; i++) {  24      NewNode=(LinkList*)malloc(sizeof(LinkList));  25              if(NewNode==NULL){  26                  printf("内存分配失败!\n");   27                  return 0;  28                }  29         printf("请输入第%d个节点元素值:",i+1);    30           scanf("%d",&data);  31           NewNode->data=data;       32     /*1*/     NewNode->next=L;  33     /*2*/      NewNode->front=p;  34     /*3*/      p->next=NewNode;  35     /*4*/      L->front=NewNode;   36     //1和4是固定的,2和3是动态的。   37               p=NewNode;   38     }  39 }  40 //打印链表       41 int TraverseDbCcLinkList(LinkList *L)    42 {    43     LinkList *p = L->next;    44     45     printf("链表打印如:\n");    46     while (p!=L)    47     {    48         printf("%d ", p->data);    49         p = p->next;    50     }    51    printf("\n");   52    printf("打印成功\n");   53 }  54 //计算链表长度  55 int GetLength(LinkList *L){  56     int length=0;  57     LinkList *p=L->next;  58     while(p!=L){  59         length++;  60         p=p->next;  61     }  62     return printf("链表长度为%d\n",length);  63 }   64 //向链表内插入节点  65 int InsertLinkList(LinkList *L){  66     LinkList *p=L->next;  67     int n,m,i=1;  68     printf("请输入想要插在第几个位置后面:\n");  69     scanf("%d",&n);  70     while(p!=L&&i<n){  71         i++;  72         p=p->next;  73     }  74     if(p==L){  75     return    printf("要插入的位置不存在!\n");  76            77     }else{  78         LinkList *S=(LinkList*)malloc(sizeof(LinkList));  79         printf("请输入要插入的值\n");  80         scanf("%d",&m);  81         S->data=m;  82         S->next=p->next;  83         S->front=p;  84         p->next->front=S;  85         p->next=S;  86     }  87     return printf("插入成功!\n");  88 }   89 //删除某个位置的数  90 int DelLinklist(LinkList *L){  91     LinkList *p=L->next,*q;  92     int n,i=1;  93     printf("请输入要删除的位置\n");  94     scanf("%d",&n);  95     while(p!=L&&i<n-1){  96         i++;  97         p=p->next;  98     }   99     if(p==L){ 100         return printf("需要删除的位置不存在!\n"); 101     }else{ 102         q=p->next; 103         printf("删除的数为%d\n",q->data);  104         p->next=p->next->next; 105         p->next->front=p; 106         free(q); 107     } 108     return printf("删除成功!\n"); 109 } 110 //查找链表某位置的数 111 int FoundElem(LinkList *L){ 112     LinkList *p=L->next; 113     int n,i=1;  114     printf("请输入你想查找的位置\n"); 115     scanf("%d",&n); 116     while(p!=L&&i<n){ 117         i++; 118         p=p->next; 119     } 120     if(p==L){ 121         return printf("位置不存在!\n"); 122     }else{ 123         return printf("该位置的值为%d",p->data); 124     } 125       126 }  127 int main(){ 128     LinkList L; 129     IntList(&L); 130     InputList(&L); 131         TraverseDbCcLinkList(&L); 132     InsertLinkList(&L); 133         GetLength(&L); 134         TraverseDbCcLinkList(&L); 135     DelLinklist(&L); 136         GetLength(&L); 137         TraverseDbCcLinkList(&L); 138     FoundElem(&L);     139  140 } 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!