含有头结点双向循环链表

 1 #include <stdio.h>         /*含有头结点双向循环链表*/
  2 #include <stdlib.h>
  3 
  4 #define T 1
  5 #define F 2
  6 
  7 typedef int ElementType;
  8 typedef int Boolean;
  9 
 10 struct Node
 11 {
 12     struct Node* prior;
 13     ElementType value;
 14     struct Node* next;
 15 };
 16 
 17 typedef struct Node* node;
 18 
 19 Boolean insert_tail(node head, ElementType value);   /*尾插*/
 20 Boolean insert_head(node head, ElementType value);   /*头插*/
 21 Boolean insert_index(node head, ElementType value, int index);  /*指定位置插入新值*/
 22 Boolean delete_index(node head, int index);             /*指定位置删除*/
 23 Boolean delete_value(node head, ElementType value);     /*指定数据删除*/
 24 Boolean update_index(node head, ElementType value, int index);   /*指定位置修改数据*/
 25 Boolean update_value(node head, ElementType old_value, ElementType new_value);  /*将数据修改*/
 26 Boolean quary_index(node head, int index);   /*指定位置察值*/
 27 Boolean quary_value(node head, ElementType value);  /*指定数据的位置*/
 28 
 29 Boolean init(node* head);       /*初始化*/
 30 int length(node head);    /*除去头结点的总长度*/
 31 void printP(node head);   /*前驱打印*/
 32 void printN(node head);   /*后驱打印*/
 33 
 34 int main()
 35 {
 36     int i;
 37     node head = NULL;
 38 
 39     init(&head);
 40     for (i = 0; i < 10; i++)
 41     {
 42         insert_head(head, i);
 43     }
 44     printN(head);
 45     printP(head);
 46 
 47     for (i = 0; i < 10; i++)
 48     {
 49         insert_tail(head, i);
 50     }
 51     printN(head);
 52     printP(head);
 53     printf("length = %d\n", length(head));
 54 
 55     insert_index(head, 99, 0);
 56     insert_index(head, 99, 11);
 57     insert_index(head, 99, length(head));
 58     printN(head);
 59     printP(head);
 60 
 61     delete_index(head, 0);
 62     delete_index(head, 10);
 63     delete_index(head, length(head)-1);
 64     printN(head);
 65     printP(head);
 66 
 67     delete_value(head, 0);
 68     printN(head);
 69     printP(head);
 70 
 71     update_index(head, 88 , 1);
 72     update_index(head, 88 , length(head)-2);
 73     printN(head);
 74 
 75     update_value(head, 88 , 888);
 76     printN(head);
 77 
 78     quary_index(head, 1);
 79     quary_index(head, length(head)-2);
 80 
 81     quary_value(head, 88);
 82     quary_value(head, 888);
 83 
 84     return 0;
 85 }
 86 
 87 Boolean quary_index(node head, int index)
 88 {
 89     if (index < 0 || index > length(head))
 90     {
 91         return F;
 92     }
 93     int i;
 94     for (i = 0; i < index; i++)
 95     {
 96         head = head->next;
 97     }
 98     printf("find = %d index =%d\n", head->next->value, index);
 99 
100     return T;
101 }
102 
103 Boolean quary_value(node head, ElementType value)
104 {
105     node temp = head;
106     int i = 0;
107     int count = 0;
108     while (temp->next != head)
109     {
110         if (temp->next->value == value)
111         {
112             i++;
113             printf("find = %d index = %d\n", value, count );
114         }
115         count++;
116         temp = temp->next;
117     }
118     if (0 == i)
119     {
120         printf("no this value\n");
121     }
122     return T;
123 }
124 
125 Boolean update_index(node head, ElementType value, int index)
126 {
127     if (index < 0 || index > length(head))
128     {
129         return F;
130     }
131     int i;
132     for (i = 0; i < index; i++)
133     {
134         head = head->next;
135     }
136     head->next->value = value;
137 
138     return T;
139 }
140 
141 Boolean update_value(node head, ElementType old_value, ElementType new_value)
142 {
143     node temp = head;
144     while (temp->next != head)
145     {
146         if (temp->next->value == old_value)
147         {
148             temp->next->value = new_value;
149         }
150             temp = temp->next;
151     }
152     return T;
153 }
154 Boolean delete_index(node head, int index)
155 {
156     if (index < 0 || index > length(head))
157     {
158         return F;
159     }
160     int i;
161     for (i = 0; i < index; i++)
162     {
163         head = head->next;
164     }
165 
166     node temp = head->next->next;
167     free(head->next);
168     head->next = temp;
169     temp->prior = head;
170 
171     return 0;
172 
173 }
174 
175 Boolean delete_value(node head, ElementType value)
176 {
177    node temp = head;
178    while (temp->next != head)
179    {
180        if (temp->next->value == value)
181        {
182            node temp2 = temp->next->next;
183            free(temp->next);
184            temp->next = temp2;
185            temp2->prior = temp;
186        }
187        else
188        {
189            temp = temp->next;
190        }
191    }
192     return T;
193 }
194 
195 Boolean insert_index(node head, ElementType value, int index)
196 {
197     node temp = head;
198     node newnode = (node)malloc(sizeof(struct Node));
199     if (NULL == newnode)
200     {
201         return F;
202     }
203     if (index < 0 || index > length(head))
204     {
205         return F;
206     }
207     newnode->value = value;
208     int i;
209     for (i = 0; i < index; i++)
210     {
211         temp = temp->next;
212     }
213     newnode->next = temp->next;
214     temp->next = newnode;
215     newnode->next->prior = newnode;
216     newnode->prior = temp;
217 
218     return T;
219 
220 }
221 
222 Boolean insert_head(node head, ElementType value)
223 {
224     node newnode = (node)malloc(sizeof(struct Node));
225     if (NULL == newnode)
226     {
227         return F;
228     }
229     newnode->value = value;
230 
231     newnode->next = head->next;
232     head->next = newnode;
233     newnode->next->prior = newnode;
234     newnode->prior = head;
235 
236     return T;
237 }
238 
239 Boolean insert_tail(node head, ElementType value)
240 {
241     node newnode = (node)malloc(sizeof(struct Node));
242     if (NULL == newnode)
243     {
244         return F;
245     }
246     newnode->value = value;
247 
248     head->prior->next = newnode;
249     newnode->next = head;
250     newnode->prior = head->prior;
251     head->prior = newnode;
252 
253     return T;
254 }
255 int length(node head)
256 {
257     int count = 0;
258     node temp = head;
259     while (temp->next != head)
260     {
261         count++;
262         temp = temp->next;
263     }
264     return count;
265 }
266 
267 Boolean init(node* head)
268 {
269     node newnode = (node)malloc(sizeof(struct Node));
270     if (NULL == newnode)
271     {
272         return F;
273     }
274     newnode->next = newnode;
275     newnode->prior = newnode;
276 
277     *head = newnode;
278 
279      return T;
280 }
281 
282 void printP(node head)
283 {
284     node temp = head;
285     while (temp->prior != head)               /*temp->prior->prior */
286     {
287         printf("%d ", temp->prior->value);
288         temp = temp->prior;
289     }
290     printf("\n");
291 
292 }
293 void printN(node head)
294 {
295     node temp = head;
296     while (temp->next != head)  /*temp->next->next */
297     {
298         printf("%d ", temp->next->value);
299         temp = temp->next;
300     }
301     printf("\n");
302 
303 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值