双向循环链表

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

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

  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 } 

 

posted on 2019-06-11 20:09  18软工五班龙向昆  阅读(135)  评论(0编辑  收藏  举报

导航