码迷,mamicode.com
首页 > 其他好文 > 详细

双循环链表

时间:2016-02-20 13:25:22      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 #define OK 1
  5 #define ERROR 0
  6 
  7 typedef int Elemtype;
  8 typedef int Status;
  9 
 10 typedef struct Node{
 11     Elemtype data;
 12     struct Node* prior;
 13     struct Node* next;
 14 }Node;
 15 typedef struct Node* DolLinkList;
 16 
 17 Status InitDolLinkList(DolLinkList *DL){
 18     *DL = (DolLinkList)malloc(sizeof(struct Node));
 19     if(!(*DL))
 20         return ERROR;
 21     (*DL)->next = *DL;
 22     (*DL)->prior = *DL;
 23     return OK;
 24 }
 25 Status ClearDolLinkList(DolLinkList DL){
 26 //将双向循环链表清为空表
 27     DolLinkList s,f = DL->next;
 28     while(f != DL){
 29         s = f;
 30         f = f->next;
 31         free(s);
 32     }
 33     DL->next = DL;
 34     DL->prior = DL;
 35     return OK;
 36 }
 37 Status DestoryDolLinkList(DolLinkList DL){
 38     ClearDolLinkList(DL);
 39     free(DL);
 40     DL = NULL;
 41 }
 42 int Length_DolLinkList(DolLinkList DL){
 43     int length = 0;
 44     DolLinkList t = DL->next;
 45     while(t != DL){
 46         t = t->next;
 47         length++;
 48     }
 49     return length;
 50 }
 51 Status GetElement_DolLinkList(DolLinkList DL,int position,int *value){
 52     int count = 0;
 53     int length = Length_DolLinkList(DL);
 54     if(position < 1 || position > length){
 55         return ERROR;
 56     }
 57     else{
 58         while(count < position){
 59             DL = DL->next;
 60             count++;
 61         }
 62         *value = DL->data;
 63         return OK;
 64     }
 65 }
 66 Status LocateElement_DolLinkList(DolLinkList DL,Elemtype value,int *position){
 67     *position = 1;
 68     DolLinkList t = DL->next;
 69     while(t != DL){
 70         if(t->data == value){
 71             return OK;    
 72         }
 73         t = t->next;
 74         (*position)++;
 75     }
 76     return ERROR;
 77 }
 78 Status GetPriorElement_DolLinkList(DolLinkList DL,int currentElement,int *priorElement){
 79     int r1;
 80     int count = 0;
 81     if(LocateElement_DolLinkList(DL,currentElement,&r1)){
 82         while(count < r1){
 83             count++;
 84             DL = DL->next;
 85         }
 86         if(count == 1)
 87             *priorElement = DL->prior->prior->data;
 88         else
 89             *priorElement = DL->prior->data;
 90         return OK;
 91     }
 92     else
 93         return ERROR;
 94 }
 95 Status GetNextElement_DolLinkList(DolLinkList DL,int currentElement,int *nextElement){
 96     int r1;
 97     if(LocateElement_DolLinkList(DL,currentElement,&r1)){
 98         int count = 0;
 99         while(count < r1){
100             count++;
101             DL = DL->next;
102         }
103         if(count == Length_DolLinkList(DL))
104             *nextElement = DL->next->next->data;
105         else
106             *nextElement = DL->next->data;
107         return OK;
108     }
109     else
110         return ERROR;
111 }
112 Status Insert_DolLinkList(DolLinkList DL,int position,int value){
113     if(position < 1 || position > Length_DolLinkList(DL) + 1)
114         return ERROR;
115     else{
116         int count = 0;
117         while(count < position){
118             count++;
119             DL = DL->next;
120         }
121         DolLinkList new = (DolLinkList)malloc(sizeof(struct Node));
122         new->data = value;
123         new->prior = DL->prior;
124         DL->prior->next = new;
125         new->next = DL;
126         DL->prior = new;
127         return OK;
128     }
129 }
130 Status Delete_DolLinkList(DolLinkList DL,int position,int *value){
131     if(position < 1 || position > Length_DolLinkList(DL))
132         return ERROR;
133     else{
134         int count = 0;
135         while(count < position){
136             count++;
137             DL = DL->next;
138         }
139         *value = DL->data;
140         DL->next->prior = DL->prior;
141         DL->prior->next = DL->next;
142         free(DL);
143     }
144 }
145 Status CreateDolLinkList_TailInsert(DolLinkList DL,int number){
146     DolLinkList new;
147     int i;
148     printf("PLEASE ENTER %d ELEMNET!\n",number);
149     for(i = 1; i <= number; i++){
150         new = (DolLinkList)malloc(sizeof(struct Node));
151         if(!new)
152             return ERROR;
153         printf("please enter element%d:   ",i);
154         scanf("%d",&(new->data));
155         new->prior = DL->prior;
156         new->next = DL;
157         DL->prior->next = new;
158         DL->prior = new;
159     }
160     return OK;
161 }
162 void DisplayDolLinkList(DolLinkList DL){
163     DolLinkList temp = DL;
164     while(temp->next != DL){
165         temp = temp->next;
166         printf("%d ",temp->data);
167     }
168     printf("\nDisplay Executed!\n\n");
169 }
170 int main(){
171     DolLinkList DL;
172     InitDolLinkList(&DL);
173     CreateDolLinkList_TailInsert(DL,5);
174     printf("the length of list is %d\n",Length_DolLinkList(DL));
175     DisplayDolLinkList(DL);
176     
177     int r1,r2;
178     if(GetElement_DolLinkList(DL,3,&r1))
179         printf("the element of postion 3 is %d\n",r1);
180     else
181         printf("Error:getElement:position\n");
182     if(GetElement_DolLinkList(DL,6,&r2))
183         printf("the element of postion 6 is %d\n",r2);
184     else
185         printf("Error:getElement:position\n");
186 
187     if(LocateElement_DolLinkList(DL,4,&r1))
188         printf("the position of element 4 is %d\n",r1);
189     else
190         printf("Error:LocateElement:value\n");
191     if(LocateElement_DolLinkList(DL,8,&r1))
192         printf("the position of element 8 is %d\n",r1);
193     else
194         printf("Error:LocateElement:value\n");
195 
196     if(GetPriorElement_DolLinkList(DL,6,&r1))
197         printf("before the 6 is %d\n",r1);
198     else
199         printf("Error:GetPriorElement:currentElement\n");
200     if(GetPriorElement_DolLinkList(DL,1,&r2))
201         printf("before the 1 is %d\n",r2);
202     else
203         printf("Error:GetPriorElement:currentElement\n");
204     
205     if(GetNextElement_DolLinkList(DL,2,&r1))
206         printf("next the 2 is %d\n",r1);
207     else
208         printf("Error:nextElement:currentElement\n");
209     if(GetNextElement_DolLinkList(DL,5,&r1))
210         printf("next the 5 is %d\n",r1);
211     else
212         printf("Error:nextElement:currentElement\n");
213     
214     Insert_DolLinkList(DL,3,666);
215     Insert_DolLinkList(DL,7,999);
216     Insert_DolLinkList(DL,1,111);
217     Insert_DolLinkList(DL,9,2222);
218     DisplayDolLinkList(DL);
219 
220     Delete_DolLinkList(DL,2,&r1);
221     Delete_DolLinkList(DL,8,&r1);
222     DisplayDolLinkList(DL);
223     return 0;
224 }

技术分享

双循环链表

标签:

原文地址:http://www.cnblogs.com/robin-xu/p/5203083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!