【C语言数据结构】循环单链表

CircleLinkList.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#ifndef CIRCLE_LINK_LIST
#define CIRCLE_LINK_LIST
 
//链表节点
typedef  struct  _CircleLinkListNode
{
     struct  _CircleLinkListNode *next;
 
}CircleLinkListNode;
 
 
//循环单链表
typedef  void  CircleLinkList;
 
 
 
/*
  * 创建循环单链表
  * @return 返回循环单链表的指针
  */
CircleLinkList* CircleLinkList_Create();
 
/*
  * 销毁循环单链表
  * @param list 循环单链表的指针
  */
void  CircleLinkList_Destroy(CircleLinkList *list);
 
/*
  * 清空循环单链表
  * @param list 循环单链表的指针
  */
void  CircleLinkList_Clear(CircleLinkList *list);
 
/*
  * 向循环单链表pos位置处插入元素
  * @param list 循环单链表指针
  * @param node 元素指针
  * @param pos 插入的索引
  */
int  CircleLinkList_Insert(CircleLinkList *list,CircleLinkListNode *node, int  pos);
 
/*
  * 获取循环单链表中索引位置处的元素
  * @param list   循环单链表指针
  * @param pos   循环单链表索引值
  * @param return 元素指针
  */
CircleLinkListNode* CircleLinkList_Get(CircleLinkList *list, int  pos);
 
/*
  * 删除循环单链表中索引位置处的值
  * @param list 循环单链表的指针
  * @param pos   循环单链表索引
  * @param return 非0表示删除成功
  */
int  CircleLinkList_Remove(CircleLinkList *list, int  pos);
 
/*
  * 获取循环单链表当前已存储元素的个数
  * @param list 循环单链表的指针
  * @return 循环单链表中已存储元素的个数
  */
int  CircleLinkList_Length(CircleLinkList *list);
 
/*
  * 删除循环单链表中的特定元素
  * @param list 循环单链表的指针
  * @param pos   循环单链表元素指针
  * @param return 非0表示删除成功
  */
int  CircleLinkList_DeleteNode(CircleLinkList* list, CircleLinkListNode* node);
 
/*
  * 重置循环单链表中的游标,指向表头
  * @param list 循环单链表的指针
  * @return 返回游标指向的元素的指针
  */
CircleLinkListNode* CircleLinkList_Reset(CircleLinkList* list);
 
/*
  * 获取当前游标指向的元素指针
  * @param list 循环单链表的指针
  * @return 返回当前游标指向的元素指针
  */
CircleLinkListNode* CircleLinkList_Current(CircleLinkList* list);
 
/*
  * 移动当前游标到下一个元素
  * @param list 循环单链表的指针
  * @return 移动后的游标指向的元素的指针
  */
CircleLinkListNode* CircleLinkList_Next(CircleLinkList* list);
 
 
 
 
#endif // CIRCLECircleLinkList

CircleLinkList.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
#include "Circlelinklist.h"
#include <malloc.h>
 
//循环单链表
typedef  struct  _CircleLinkList
{
     CircleLinkListNode header; //链表头节点
     CircleLinkListNode* cursor; //游标
     int  length; //链表长度
 
}TCircleLinkList;
 
 
 
/*
  * 创建循环单链表
  * @return 返回循环单链表的指针
  */
CircleLinkList* CircleLinkList_Create()
{
     TCircleLinkList *list  = (TCircleLinkList *) malloc ( sizeof (TCircleLinkList));
 
     if (list != 0)
     {
         list->header.next = 0;
         list->length= 0;
     }
 
     return  list;
}
 
/*
  * 销毁循环单链表
  * @param list 循环单链表的指针
  */
void  CircleLinkList_Destroy(CircleLinkList *list)
{
     free (list);
}
 
/*
  * 清空循环单链表
  * @param list 循环单链表的指针
  */
void  CircleLinkList_Clear(CircleLinkList *list)
{
     if (list != 0)
     {
         TCircleLinkList *c_list = (TCircleLinkList *)c_list;
         c_list->header.next = 0;
         c_list->length = 0;
         c_list->cursor = 0;
     }
}
 
/*
  * 向循环单链表pos位置处插入元素
  * @param list 循环单链表指针
  * @param node 元素指针
  * @param pos 插入的索引
  */
int  CircleLinkList_Insert(CircleLinkList *list,CircleLinkListNode *node, int  pos)
{
     //类型转换
     TCircleLinkList* l_list = (TCircleLinkList *)list;
     //判断链表指针和节点指针不能为空,当前插入的位置是否合法
     int  ret = ((list != 0) && (node != 0) && (pos >= 0) && (pos <= l_list->length));
 
     if (ret)
     {
         CircleLinkListNode* current = (CircleLinkListNode *)l_list;
         int  i;
         //移动到需要插入的位置的前驱
         for (i = 0; i < pos;i++)
         {
             current = current->next;
         }
 
         node->next = current->next;    //被插入节点的后继指针指向前驱节点的后继指针
         current->next = node;          //前驱节点的后继指针指向被插入节点
 
         //如果插入的位置是0,则需要修改尾节点的后继指针
         if (pos == 0)
         {
             current = l_list->header.next;
             for (i = 0;i < l_list->length;i++)
             {
                 current = current->next;
             }
             current->next = node; //改变尾节点的指针
 
             //判断插入是否是空表
             if (l_list->length == 0)
             {
                 l_list->cursor = node;
                  node->next = node;
             }
         }
 
         l_list->length++;
 
     }
 
     return  ret;
}
 
/*
  * 获取循环单链表中索引位置处的元素
  * @param list   循环单链表指针
  * @param pos   循环单链表索引值
  * @param return 元素指针
  */
CircleLinkListNode* CircleLinkList_Get(CircleLinkList *list, int  pos)
{
     CircleLinkListNode* node = 0;
     TCircleLinkList * l_list = (TCircleLinkList *)list;
     //判断链表指针不为空,且获取的索引合法
     if ( (l_list != 0) && (pos >= 0))
     {
 
         CircleLinkListNode* current = (CircleLinkListNode *)l_list;
         int  i;
         for (i = 0; i < pos; i++)
         {
             current = current->next;
         }
         node = current->next;
     }
 
     return  node;
}
 
/*
  * 删除循环单链表中索引位置处的值
  * @param list 循环单链表的指针
  * @param pos   循环单链表索引
  * @param return 非0表示删除成功
  */
int  CircleLinkList_Remove(CircleLinkList *list, int  pos)
{
     TCircleLinkList * l_list = (TCircleLinkList *)list;
     int  ret = ((l_list != 0) && (pos >= 0) && (pos < l_list->length));
 
     if (ret)
     {
         CircleLinkListNode* current = (CircleLinkListNode *)list;
         CircleLinkListNode* first = l_list->header.next;
         CircleLinkListNode* last = (CircleLinkListNode*)CircleLinkList_Get(l_list, l_list->length - 1);
         CircleLinkListNode *del;
         int  i;
         for (i=0; i<pos; i++)
         {
             current = current->next;
         }
 
         del = current->next;
         current->next = del->next;
 
         l_list->length--;
 
         if ( first == del )
         {
             l_list->header.next = del->next;
             last->next = del->next;
         }
 
         if ( l_list->cursor == del )
         {
             l_list->cursor = del->next;
         }
 
         if ( l_list->length == 0 )
         {
             l_list->header.next = 0;
             l_list->cursor = 0;
         }
     }
 
     return  ret;
}
 
/*
  * 获取循环单链表当前已存储元素的个数
  * @param list 循环单链表的指针
  * @return 循环单链表中已存储元素的个数
  */
int  CircleLinkList_Length(CircleLinkList *list)
{
     int  ret = -1;
     if (list != 0)
     {
         TCircleLinkList * l_list = (TCircleLinkList *)list;
         ret = l_list->length;
     }
 
     return  ret;
}
 
 
/*
  * 删除循环单链表中的特定元素
  * @param list 循环单链表的指针
  * @param pos   循环单链表元素指针
  * @param return 被删除元素的索引
  */
int  CircleLinkList_DeleteNode(CircleLinkList* list, CircleLinkListNode* node)
{
     int  ret = -1;
 
     if ((list != 0) && (node != 0))
     {
         TCircleLinkList * l_list = (TCircleLinkList *)list;
         CircleLinkListNode* current = l_list->header.next;
         int  i;
         for (i = 0; i < l_list->length ;i++)
         {
             if (node == current)
             {
                 CircleLinkList_Remove(l_list,i);
                 ret = i;
                 break ;
             }
             current = current->next;
         }
     }
 
     return  ret;
}
 
/*
  * 重置循环单链表中的游标,指向表头
  * @param list 循环单链表的指针
  * @return 返回游标指向的元素的指针
  */
CircleLinkListNode* CircleLinkList_Reset(CircleLinkList* list)
{
     CircleLinkListNode *node = 0;
     if (list != 0)
     {
          TCircleLinkList * l_list = (TCircleLinkList *)list;
          l_list->cursor = l_list->header.next;
          node = l_list->cursor;
     }
 
     return  node;
}
 
/*
  * 获取当前游标指向的元素指针
  * @param list 循环单链表的指针
  * @return 返回当前游标指向的元素指针
  */
CircleLinkListNode* CircleLinkList_Current(CircleLinkList* list)
{
     CircleLinkListNode *node = 0;
     if (list != 0)
     {
          TCircleLinkList * l_list = (TCircleLinkList *)list;
          node = l_list->cursor;
     }
 
     return  node;
}
 
/*
  * 移动当前游标到下一个元素
  * @param list 循环单链表的指针
  * @return 移动后的游标指向的元素的指针
  */
CircleLinkListNode* CircleLinkList_Next(CircleLinkList* list)
{
     CircleLinkListNode *node = 0;
     if (list != 0)
     {
          TCircleLinkList * l_list = (TCircleLinkList *)list;
          l_list->cursor = l_list->cursor->next;
          node = l_list->cursor;
     }
 
     return  node;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include "Circlelinklist.h"
 
struct  Value
{
     CircleLinkListNode node;
     int  val;
};
 
int  main( void )
{
    struct  Value val[5];
    int  i;
    struct  Value *p;
 
 
    CircleLinkList *list = CircleLinkList_Create();
    for (i = 0;i < 5;i++)
    {
         val[i].val = i;
    }
 
    for (i = 0;i < 5;i++)
    {
        CircleLinkList_Insert(list,(CircleLinkListNode *)&(val[i]),0);
    }
 
  // CircleLinkList_DeleteNode(list,&(val[0]));
 
 
 
    for (i = 0;i < 6;i++)
    {
        p = CircleLinkList_Get(list,i);
        printf ( "%d\n" ,p->val);
        CircleLinkList_Next(list);
 
    }
 
    CircleLinkList_Reset(list);
    p = CircleLinkList_Get(list,0);
    printf ( "%d\n" ,p->val);
 
 
 
 
 
 
 
    return  0;
}

本文出自 “沃特” 博客,请务必保留此出处http://water3700348.blog.51cto.com/13058625/1965609


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环链表链表的一种特殊形式,它的特点是链表中的最后一个节点的指针指向第一个节点,形成一个闭合的环。在C语言中,操作循环链表通常涉及创建、插入、删除和遍历等基本操作。 以下是一些基本操作的C语言实现概览: 1. **创建循环链表**: - 定义节点结构体,包含数据域和指向下一个节点的指针(如果是在头结点的最后一个节点,指针会指向自身)。 - 创建链表时,可以初始化一个头节点,然后递归地添加新节点到链尾。 ```c struct Node { int data; struct Node* next; }; // 创建循环链表 void createCircularList(struct Node** head, int size, ...) { ... } ``` 2. **插入节点**: - 可以在链表的头部、尾部或指定位置插入节点。 - 在头部插入,更新头节点的next;在尾部插入,找到当前尾节点,然后更新其next指向新节点,并将新节点next指向头节点。 ```c void insertNode(struct Node** head, int data, insertionPosition) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = (insertionPosition == 1) ? head : (*(head)->next); // 如果在尾部插入,更新尾节点和头节点的next指针 if (insertionPosition == 0) { (*head)->next = newNode; } } ``` 3. **删除节点**: - 删除某个节点时,需要找到前一个节点,然后更新其next指针跳过要删除的节点。 - 在循环链表中删除特定位置的节点需要特别处理头节点的情况。 ```c void deleteNode(struct Node** head, int position) { if (position == 1) { // 删除头节点 struct Node* temp = head->next; *head = temp; free(head); } else { struct Node* current = *head, *previous = NULL; for (int i = 1; i < position && current != NULL; ++i) { previous = current; current = current->next; } if (current == NULL) return; // 未找到节点 previous->next = current->next; } } ``` 4. **遍历循环链表**: - 使用while循环,每次迭代都更新当前节点指向下一个节点,直到遇到第一个节点。 ```c void printList(struct Node* head) { struct Node* temp = head; do { printf("%d ", temp->data); temp = temp->next; } while (temp != head); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值