1.首先簡單了解一下鏈表的概念:
要注意的是鏈表是一個結構體實現的一種線性表,它只能從前往后,不可以從后往前(因為next只保存下一個節點的地址).在實現單鏈表的操作時,需要用指針來操作.很簡單,注釋寫的很詳細,歡迎大家指正哈哈哈哈~之前寫的太爛了重新寫了一下.....
2.代碼展示:
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
|
#include <stdio.h> #include <assert.h> #include <stdlib.h> typedef struct linklist { int data; struct linklist* next; }node; //目錄 //1.動態申請節點 node* Creatnode( int x); //2.單鏈表的尾插 void PushBack(node** plist, int x); //3.單鏈表的打印 void Printlist(node** plist); //4.單鏈表尾刪 void Popback(node** plist); //5.單鏈表的頭插 void PushFront(node** plist, int x); //6.單鏈表的頭刪 void PopFrount(node** plist); //7.單鏈表的查找 node* Findpos(node* plist, int x); //8.單鏈表在pos位置之后插入x void Insertlinstafter(node* pos, int x); //9.單鏈表刪除pos位置之后的元素 void PopPosAfter(node* pos); //10.單鏈表的銷毀 void Destorylist(node** plist); //1.動態申請節點 node* Creatnode( int x) { node* t = (node*) malloc ( sizeof (node)); if (t == NULL) { assert (0); return NULL; } else { t->next = NULL; t->data = x; return t; } } //2.單鏈表的尾插 void PushBack(node** plist, int x) { assert (plist); if (*plist == NULL) { *plist = Creatnode(x); } else { node* p = *plist; while (p->next) { p = p->next; } p->next = Creatnode(x); } } //3.單鏈表的打印 void Printlist(node** plist) { assert (plist); node* p =* plist; while (p) { printf ( "%d " , p->data); p = p->next; } } //4.單鏈表尾刪 void Popback(node** plist) { assert (plist); if (*plist == NULL) { return NULL; } node* p = *plist; node* q = NULL; while (p->next) { q = p; p = p->next; } q->next =NULL; free (p); } //5.單鏈表的頭插 void PushFront(node** plist, int x) { assert (plist); node* t = Creatnode(x); if (NULL == *plist) { *plist = t; } else { t->next = *plist; *plist = t; } } //6.單鏈表的頭刪 void PopFrount(node** plist) { assert (plist); if (plist == NULL) { return NULL; } else { node* p = *plist; *plist = p->next; free (p); } } //7.單鏈表的查找 node* Findpos(node* plist, int x) { node* cur = plist; while (cur) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL; } //8.單鏈表在pos位置之后插入x void Insertlinstafter(node* pos, int x) { assert (pos); if (NULL == pos) { return ; } node* t = Creatnode(x); t->next = pos->next; pos->next = t; } //9.單鏈表刪除pos位置之后的元素 void PopPosAfter(node* pos) { assert (pos); if (pos->next == NULL) { return ; } else { node* p = pos->next; pos->next = p->next; free (p); } } //10.單鏈表的銷毀 void Destorylist(node** plist) { assert (plist); node* p = *plist; while (p) { *plist = p->next; free (p); p = *plist; } *plist = NULL; } void test1() { node* plist=NULL; //創建頭指針 PushBack(&plist, 1); //尾插元素 PushBack(&plist, 2); PushBack(&plist, 3); PushBack(&plist, 4); PushBack(&plist, 5); Printlist(&plist); //打印鏈表元素 1 2 3 4 5 printf ( "\n" ); Popback(&plist); //尾刪元素 PushFront(&plist, 0); //首插元素0 Printlist(&plist); //打印鏈表 0 1 2 3 4 printf ( "\n" ); PopFrount(&plist); //首刪元素0 Printlist(&plist); //打印鏈表 1 2 3 4 printf ( "\n" ); Findpos(plist,1); //尋找鏈表中1的地址,不方便演示,下面會演示 Insertlinstafter(Findpos(plist, 4), 5); //在4后面插入5,用到上面的Findpos函數 Printlist(&plist); //打印鏈表 1 2 3 4 5 printf ( "\n" ); PopPosAfter(Findpos(plist, 4)); //刪除指定位置后面的元素(刪除4后面的5) Printlist(&plist); //打印鏈表 1 2 3 4 printf ( "\n" ); Destorylist(&plist); //銷毀鏈表 Printlist(&plist); //打印鏈表 } void test() { test1(); } int main() { test(); return 0; } |
3.測試結果:
a.先創建了頭指針plist
b.尾插1 2 3 4 5
c. 尾刪元素5
d.首插元素0
e.首刪元素0
f.在元素4 后面插入5
g.刪除4元素后面的5
h.銷毀鏈表
到此這篇關于C語言實現單鏈表的基本功能詳解的文章就介紹到這了,更多相關單鏈表基本功能內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_62029250/article/details/121483573