C语言实现无头节点单链表
2017-06-14 22:34
260 查看
测试代码
singlelinkedlist.h头文件
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
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
singlelinkedlist.c实现部分
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
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
test.c测试部分
singlelinkedlist.h头文件
#ifndef __SINGLELINKEDLIST_H__ #include<stdio.h> #include<windows.h> #include<assert.h> typedef int DataType; typedef struct ListNode { DataType data; struct ListNode *next; }ListNode; ListNode *InitList(DataType num);//初始化并赋值 void PushBack(ListNode **pplist, DataType num);//尾插 void PrintList(ListNode *plist);//输出 void DestoryList(ListNode** pplist);//释放链表(包括环) void PopBack(ListNode **pplist);//尾删 void PushFront(ListNode **pplist, DataType num);//头插 void PopFront(ListNode **pplist);//头删 ListNode* Find(ListNode *plist, DataType num);//查找 void Insert(ListNode** pplist, ListNode* pos, DataType x);//插入 void Erase(ListNode** pplist, ListNode* pos);//删除 #endif//__SINGLELINKEDLIST_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
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
singlelinkedlist.c实现部分
#include "singlelinkedlist.h" ListNode *InitList(DataType num)//定义一个新的结点 { ListNode *node = (ListNode*)malloc(sizeof(ListNode)); node->data = num; node->next = NULL; return node; } void PushBack(ListNode **pplist, DataType num)//尾插 { if (*pplist == NULL)//空链表 { *pplist = InitList(num);//定义一个结点 } else if ((*pplist)->next == NULL)//只有一个结点 { (*pplist)->next = InitList(num); } else//正常情况(多个结点) { ListNode *tail = *pplist; while (tail->next) { tail = tail->next;//依次指向下一个结点,找到为空的尾结点 } tail->next = InitList(num);//找到以后直接添加一个结点 } } void PrintList(ListNode *plist)//打印链表 { ListNode *tail = plist; while (tail) { printf("%d->", tail->data); tail = tail->next; } printf("NULL"); printf("\n"); } void DestoryList(ListNode** pplist)//释放链表(包括环) { assert(pplist); ListNode* cur = *pplist; while (cur) { ListNode* next = cur->next; free(cur); cur = next; } *pplist = NULL; } void PopBack(ListNode **pplist)//尾删 { if (*pplist == NULL)//空链表 { return; } else if ((*pplist)->next == NULL)//只有一个结点,直接释放 { free(*pplist); *pplist = NULL; } else { ListNode* tail = *pplist; ListNode* pos = tail; while (tail->next)//tail指向pos的后一个结点 { pos = tail; tail = tail->next; } free(tail);//释放最后一个结点就相当于删除了尾结点 tail = NULL; pos->next = NULL; } } void PushFront(ListNode **pplist, DataType num)//头插 { if (*pplist == NULL)//空链表 { *pplist = InitList(num); } else { ListNode *tmp = InitList(num);//开辟一个新的结点 tmp->next = *pplist;//让它指向原先的开始结点 *pplist = tmp;//pplist依然开始结点 } } void PopFront(ListNode **pplist)//头删 { if (*pplist == NULL)//空链表 { return; } else if ((*pplist)->next == NULL)//只有一个结点 { *pplist = NULL; } else { ListNode *tmp = (*pplist)->next;//tmp指向原先头结点指向的下一个位置 free(*pplist); *pplist = tmp; } } ListNode* Find(ListNode *plist, DataType num)//查找 { assert(plist);//断言其是否为空链表 while (plist) { if (plist->data == num) { return plist; } plist = plist->next; } return NULL; } void Insert(ListNode** pplist, ListNode* pos, DataType num)//插入 { assert(*pplist&&pos); if (((*pplist)->next == NULL) || (pos == *pplist)) //只有开始结点或者是要插入的正好在开始结点的前面 { PushFront(pplist, num); } else { ListNode* tmp = NULL; ListNode* tail = *pplist; while (tail->next != pos) { tail = tail->next; } tmp = InitList(num); tail->next = tmp; tmp->next = pos; } } void Erase(ListNode** pplist, ListNode* pos)//删除 { assert(*pplist&&pos); if (((*pplist)->next == NULL) || (*pplist == pos)) { PopFront(pplist); } else { ListNode* tmp = *pplist; while (tmp->next != pos) { tmp = tmp->next; } tmp->next = pos->next; free(pos); pos = NULL; } }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
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
test.c测试部分
#include "singlelinkedlist.h" void test() { ListNode *list = NULL; PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); PushBack(&list, 4); PrintList(list); PopBack(&list); PrintList(list); PopBack(&list); PrintList(list); PopBack(&list); PrintList(list); PopBack(&list); PrintList(list); } void test1() { ListNode *list = NULL; PushFront(&list, 1); PushFront(&list, 2); PushFront(&list, 3); PushFront(&list, 4); PushFront(&list, 5); PrintList(list); PopFront(&list); PrintList(list); PopFront(&list); PrintList(list); PopFront(&list); PrintList(list); PopFront(&list); PrintList(list); PopFront(&list); PrintList(list); } void test2() { ListNode *list = NULL; PushFront(&list, 1); PushFront(&list, 2); PushFront(&list, 4); PushFront(&list, 5); PushFront(&list, 6); PrintList(list); ListNode *ret = Find(list, 2); //测试使用 /*if (ret != NULL) { printf("%p\n", ret); } else { printf("没有这个值!\n"); }*/ Insert(&list, ret, 3); PrintList(list); Erase(&list, ret); PrintList(list); } int main() { //test(); //test1(); test2(); system("pause"); return 0; }
相关文章推荐
- C语言实现无头节点的单链表
- 【数据结构】C语言实现无头节点单链表
- C语言实现无头节点链表
- 带头节点链表实例(C语言实现)
- C语言实现单链表(不带头结点)节点的插入
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现单链表节点的删除(带头结点)
- c语言单向链表的简单实现,隐藏head节点
- 单向链表之删除节点(C语言实现)
- C语言实现 从尾到头打印链表每个节点的值(链表学习 二)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言:【单链表】删除一个无头单链表的非尾节点
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言实现,无头结点不带环的单向链表的基本操作
- 单向链表之有序插入节点(C语言实现)
- C语言实现单链表节点的删除(带头结点)
- C语言中链表节点的实现,以及如何实现泛型
- 链表问题之无头单链表删节点<Java实现>
- C语言实现输出链表中倒数第k个节点
- C语言实现链表节点的删除