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

双向循环链表

时间:2015-09-04 21:15:25      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

双向循环链表可理解为一个闭环,一般为了区别和操作方便,头结点不存内容。以下是整个过程的代码实现

  1 #include <stdio.h>
  2 typedef int DATATYPE;//定义int的别名,以防止以后结点内容不是int了可以方便替换
  3 //定义链表结点结构体
  4 struct node
  5 {
  6     DATATYPE data;//数据域
  7     struct node *left;//指向前一个结点,用left其实更便于理解
  8     struct node *right;//指向后一个结点用right也是为了便于理解,next也不错
  9 };
 10 typedef struct node Node;//定义别名,方便书写
 11  
 12 Node * createDList();//创建双向循环链表
 13 int insertList1(Node *head, DATATYPE data);//头插法插入
 14 int insertList2(Node *head, DATATYPE data);//尾插法插入
 15 void printDlist(Node * head);//打印链表内容
 16 Node *searchNode(Node *head, DATATYPE find);//查找链表中的元素,双向查找
 17 void sortList1(Node *head, int len);//交换内容排序 基于冒泡
 18 void sortList2(Node *head, int len);//交换指针排序 基于冒泡
 19 void sortList3(Node *head, int len);//基于选择排序的交换内容排序
 20 int deleteNode(Node *head, DATATYPE data);//删除指定节点
 21 int lenList(Node *head);//求双向循环链表的长度
 22 void destroyList(Node *head);//求双向循环链表的长度
 23  
 24 int main(void)
 25 {
 26     Node *head = createDList();//创建链表
 27     printf("head=%p\n", head);
 28     int i = 0;
 29     for (i = 7; i >= 0; i--)//为链表赋初始测试值
 30 //      insertList1(head, i);
 31         insertList2(head, i);
 32     printDlist(head);
 33     printf("——————\n");
 34     DATATYPE find = 3;//测试查找函数
 35     Node *search=searchNode(head, find);
 36     if (search != NULL)
 37         printf("search=%d\n", search->data);
 38     else
 39         printf("no such number\n");
 40     DATATYPE data = 0;
 41     deleteNode(head, data);//测试删除函数
 42     int len = lenList(head);//测试求长度函数
 43     printf("len=%d\n",len);
 44 //  sortList1(head, len);//测试排序函数
 45 //  sortList2(head, len);
 46     sortList3(head, len);
 47     printDlist(head);
 48     destroyList(head);//销毁所有结点
 49     printf("销毁后的头节点:=%p\n",head->right);
 50     printf("sizeof(head)=%d\n",sizeof(head));
 51     return 0;
 52 }
 53 //创建双向循环链表,只需要返回一个头结点就好
 54 //双向循环链表,就想一个闭环一样的概念,一般头结点中不存储内容
 55 Node * createDList()
 56 {
 57     Node *head = (Node *)malloc(sizeof(Node));
 58     if (head)
 59     {
 60         head->left = head;
 61         head->right = head;
 62         return head;
 63     }
 64     else
 65         return NULL;
 66 }
 67 //头插法插入,每次插入在头结点后紧跟着
 68 int insertList1(Node *head, DATATYPE data)
 69 {
 70     Node *newNode = (Node *)malloc(sizeof(Node));
 71     if (newNode)
 72     {
 73         newNode->data = data;
 74  
 75         newNode->left = head;
 76         newNode->right = head->right;
 77  
 78         head->right = newNode;
 79         newNode->right->left = newNode;
 80  
 81         return 1;
 82     }
 83     else
 84         return -1;
 85 }
 86 //尾插法插入,每次插入在头结点之前
 87 int insertList2(Node *head, DATATYPE data)
 88 {
 89     Node *newNode = (Node *)malloc(sizeof(Node));
 90     if (newNode)
 91     {
 92         newNode->data = data;
 93         head->left->right = newNode;
 94         newNode->left = head->left;
 95         newNode->right = head;
 96         head->left = newNode;
 97         return 1;
 98     }
 99     return -1;
100 }
101 //打印链表内容
102 void printDlist(Node * head)
103 {
104     Node *p = head->right;
105     while (p != head)
106     {
107         printf("%d\n", p->data);
108         p = p->right;
109     }
110 }
111 //查找链表中的元素,双向查找
112 Node *searchNode(Node *head, DATATYPE find)
113 {
114     Node *left = head;//left表示一个结点的前驱结点,初始值是头结点
115     Node *right = head;//right表示一个结点的后继结点,初始值是头结点
116     do
117     {
118         left = left->left;//移动向前一个
119         right = right->right;//移动向后一个
120         if (left->data == find)//如果此时结点发现查找内容,就返回结点信息
121             return left;
122         if (right->data == find)//如果此时结点发现查找内容,就返回结点信息
123             return right;  
124     } while (left != right && left->left!=right);//当两个结点相遇或者错过时候终止循环
125     //如果除了头结点是偶数个,则相互错过时候终止
126     //如果除了头结点是奇数个,则相遇时候终止查找
127     return NULL;   
128 }
129 //交换内容排序 基于冒泡
130 void sortList1(Node *head, int len)
131 {
132     int i = 0, j = 0;
133     Node *p, *q;
134     for (i = 0; i < len - 1; i++)
135     {
136         p = head->right;
137         q = p->right;
138         for (j = 0; j < len - 1 - i; j++)
139         {
140             if (p->data<q->data){
141                 p->data ^= q->data;
142                 q->data ^= p->data;
143                 p->data ^= q->data;
144             }
145             p = p->right;
146             q = q->right;
147         }
148     }
149      
150 }
151 //交换指针排序 基于冒泡
152 void sortList2(Node *head, int len)
153 {
154     Node *p, *q;
155     int i = 0, j = 0;
156     for (i = 0; i < len - 1; i++)
157     {
158         p = head->right;
159         q = p->right;
160         for (j = 0; j < len - 1-i; j++)
161         {
162             if (p->data < q->data){
163                 q->left = p->left;
164                 p->left->right = q;
165                 p->right = q->right;
166                 q->right->left = p;
167                 q->right = p;
168                 p->left = q;
169  
170                 q = p->right;
171                  
172             }
173             else{
174                 p = p->right;
175                 q = q->right;
176             }
177              
178         }
179     }
180 }
181 //基于选择排序的交换内容排序
182 void sortList3(Node *head, int len)
183 {
184     Node *p, *q, *max, *temp;
185     DATATYPE t;
186     p = head->right;
187     q = p->right;
188     int i = 0, j = 0;
189     for (i = 0; i < len-1 ; i++)
190     {
191         if (p == head)
192             break;
193         max = p;
194         q = p;
195         for (j = i; j < len; j++)
196         {
197             if (q == head)
198                 break;
199             if (max->data > q->data)
200                 max = q;
201             q = q->right;
202         }
203         if (max != p)
204         {
205             t = max->data;
206             max->data = p->data;
207             p->data = t;       
208         }
209         p = p->right;
210     }   
211 }
212 //基于选择排序的交换指针排序,写了但是一直出问题?
213 //删除指定节点
214 int deleteNode(Node *head, DATATYPE data)
215 {
216     Node *search = searchNode(head, data);
217     if (search){
218         search->left->right = search->right;
219         search->right->left = search->left;
220         free(search);
221         return 1;
222     }
223     return 0;
224 }
225 //求双向循环链表的长度
226 int lenList(Node *head)
227 {
228     Node *p = head;
229     int len = 0;
230     while (p->right != head){
231         len++;
232         p = p->right;
233     }
234     return len;
235 }
236 //销毁所有记录
237 void destroyList(Node *head)
238 {
239     Node *p = head->right;
240     while (p != head)
241     {
242         p = p->right;
243         free(p->left);
244     }
245     free(head);
246      
247 }

 

双向循环链表

标签:

原文地址:http://www.cnblogs.com/luojialin/p/4782322.html

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