1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <malloc.h>
4 #include <string.h>
5
6 //联系人节点结构体
7 typedef struct _LinkNode{
8 char name[10]; //姓名
9 char phone[15]; //电话
10 struct _LinkNode* next; //下一个联系人指针
11 }LinkNode;
12
13 //初始化操作
14 LinkNode* InitList(){
15 LinkNode* head = NULL;
16 head = (LinkNode*)malloc(sizeof(LinkNode));
17 if(head == NULL){
18 printf("内存分配失败\n");
19 return NULL;
20 }
21 //初始化,将其指向下一结点指针置空
22 memset(head, 0, sizeof(LinkNode));
23 head->next = NULL;
24 }
25
26 //取元素操作,i为需要取的元素排序
27 LinkNode* GetElem(LinkNode* ls, int i){
28 LinkNode* temp = NULL;
29 int j = 0;
30 if(ls == NULL){
31 printf("头结点不存在\n");
32 return NULL;
33 }
34 if(i < 1){
35 printf("参数输入错误\n");
36 return NULL;
37 }
38 //temp指向第一个元素
39 temp = ls->next;
40 j = 1;
41 //循环找到第i个元素
42 while(temp != NULL && j < i){
43 temp = temp->next;
44 j++;
45 }
46 //第i个元素为空或者元素数量少于i
47 if(temp == NULL || j != i){
48 printf("元素不存在\n");
49 return NULL;
50 }
51 return temp;
52 }
53
54 //插入新元素到第i个位置之前
55 void InsertElem(LinkNode* ls, int i, LinkNode* elem){
56 LinkNode* temp = NULL;
57 LinkNode* newnode = NULL;
58 int j = 0;
59 if(ls == NULL){
60 printf("线性表不存在\n");
61 return ;
62 }
63 if(i < 1){
64 printf("参数输入错误\n");
65 return ;
66 }
67 if(elem == NULL){
68 printf("待插入元素不存在\n");
69 return ;
70 }
71 temp = ls;
72 j = 1;
73 //寻找第i-1个节点
74 while(temp != NULL && j < i){
75 temp = temp->next;
76 j++;
77 }
78 if(j < i - 1){
79 printf("第%d个元素不存在\n", i - 1);
80 return ;
81 }
82 //为新节点分配内存
83 newnode = (LinkNode*)malloc(sizeof(LinkNode));
84 if(newnode == NULL){
85 printf("内存分配失败\n");
86 return ;
87 }
88 memcpy(newnode, elem, sizeof(LinkNode));
89 newnode->next = temp->next;
90 temp->next = newnode;
91 }
92
93 //销毁链表
94 void DestroyList(LinkNode* ls){
95 LinkNode* temp = NULL;
96 LinkNode* next = NULL;
97 if(ls == NULL){
98 printf("链表不存在\n");
99 return ;
100 }
101 temp = ls;
102 while(temp != NULL){
103 next = temp->next;
104 free(temp);
105 temp = next;
106 }
107 }
108
109 //打印节点
110 void PrintNode(LinkNode* elem){
111 if(elem == NULL){
112 return ;
113 }
114 printf("%8s\t%13s\n", elem->name, elem->phone);
115 }
116
117 //遍历输出链表
118 void TravList(LinkNode* ls){
119 LinkNode* temp = NULL;
120 if(ls == NULL){
121 printf("链表不存在\n");
122 return ;
123 }
124 temp = ls->next;
125 while(temp != NULL){
126 PrintNode(temp);
127 temp = temp->next;
128 }
129 }
130
131 //删除元素
132 LinkNode DeleteElem(LinkNode* ls, int i){
133 LinkNode ret = {"", "", NULL};
134 LinkNode* temp = NULL;
135 LinkNode* del = NULL;
136 int j = 0;
137 if(ls == NULL){
138 printf("链表不存在\n");
139 return ret;
140 }
141 if(i < 1){
142 printf("输入参数错误\n");
143 return ret;
144 }
145 temp = ls;
146 j = 1;
147 while(temp != NULL && j < i){
148 temp = temp->next;
149 j++;
150 }
151 if(temp == NULL || j != i){
152 printf("第%d个元素不存在\n", i - 1);
153 return ret;
154 }
155 if(temp->next == NULL){
156 printf("第%d个元素不存在\n", i);
157 return ret;
158 }
159 //修改i-1元素的指针,指向i的下一个位置,拷贝第i个元素信息到et中,然后删除第i个元素
160 del = temp->next;
161 temp->next = del->next;
162 memcpy(&ret, temp->next, sizeof(LinkNode));
163 free(del);
164 return ret;
165 }
166
167 //修改第i个元素
168 void ModifyElem(LinkNode* ls, int i, LinkNode* mod){
169 LinkNode* temp = NULL;
170 int j = 0;
171 if(ls == NULL || mod == NULL || i < 1){
172 printf("参数无效\n");
173 return ;
174 }
175 temp = ls->next;
176 j = 1;
177 while(temp != NULL && j < i){
178 temp = temp->next;
179 j++;
180 }
181 if(temp == NULL && j != i){
182 printf("第%d个元素不存在\n", i);
183 return ;
184 }
185 strcpy(temp->name, mod->name);
186 strcpy(temp->phone, mod->phone);
187 }
188
189 int main(){
190 LinkNode* head = NULL;
191 int i = 0;
192 LinkNode temp;
193 LinkNode* result;
194 //初始化链表
195 head = InitList();
196 if(head == NULL){
197 return 1;
198 }
199 //链表操作
200 for(i = 0; i < 20; i++){
201 sprintf(temp.name, "sru%03d", i + 1);
202 sprintf(temp.phone, "1311122%04d", i + 10);
203 InsertElem(head, i + 1, &temp);
204 }
205 TravList(head);
206 //查找操作验证, 查找元素
207 printf("\n分别查找第1,20, 10, 21, -1个元素\n");
208 result = GetElem(head, 1);
209 if(result != NULL){
210 printf("%8s\t%13s\n", result->name, result->phone);
211 }
212 result = GetElem(head, 20);
213 if(result != NULL){
214 printf("%8s\t%13s\n", result->name, result->phone);
215 }
216 result = GetElem(head, 10);
217 if(result != NULL){
218 printf("%8s\t%13s\n", result->name, result->phone);
219 }
220 result = GetElem(head, 21);
221 if(result != NULL){
222 printf("%8s\t%13s\n", result->name, result->phone);
223 }
224 result = GetElem(head, -1);
225 if(result != NULL){
226 printf("%8s\t%13s\n", result->name, result->phone);
227 }
228
229 //删除元素验证
230 printf("\n删除元素验证\n");
231 DeleteElem(head, 1);
232 DeleteElem(head, 10);
233 DeleteElem(head, 20);
234 DeleteElem(head, 21);
235
236 TravList(head);
237
238 //修改元素验证
239 printf("\n修改元素验证\n");
240 strcpy(temp.name, "mod");
241 strcpy(temp.phone, "123");
242 ModifyElem(head, 0, &temp);
243 ModifyElem(head, 1, &temp);
244 ModifyElem(head, 10, &temp);
245 ModifyElem(head, 18, &temp);
246 ModifyElem(head, 21, &temp);
247
248 TravList(head);
249
250 //销毁链表
251 DestroyList(head);
252 return 0;
253 }
254
255 /*
256 sru001 13111220010
257 sru002 13111220011
258 sru003 13111220012
259 sru004 13111220013
260 sru005 13111220014
261 sru006 13111220015
262 sru007 13111220016
263 sru008 13111220017
264 sru009 13111220018
265 sru010 13111220019
266 sru011 13111220020
267 sru012 13111220021
268 sru013 13111220022
269 sru014 13111220023
270 sru015 13111220024
271 sru016 13111220025
272 sru017 13111220026
273 sru018 13111220027
274 sru019 13111220028
275 sru020 13111220029
276
277 分别查找第1,20, 10, 21, -1个元素
278 sru001 13111220010
279 sru020 13111220029
280 sru010 13111220019
281 元素不存在
282 参数输入错误
283
284 删除元素验证
285 第19个元素不存在
286 第20个元素不存在
287 sru002 13111220011
288 sru003 13111220012
289 sru004 13111220013
290 sru005 13111220014
291 sru006 13111220015
292 sru007 13111220016
293 sru008 13111220017
294 sru009 13111220018
295 sru010 13111220019
296 sru012 13111220021
297 sru013 13111220022
298 sru014 13111220023
299 sru015 13111220024
300 sru016 13111220025
301 sru017 13111220026
302 sru018 13111220027
303 sru019 13111220028
304 sru020 13111220029
305
306 修改元素验证
307 参数无效
308 第21个元素不存在
309 mod 123
310 sru003 13111220012
311 sru004 13111220013
312 sru005 13111220014
313 sru006 13111220015
314 sru007 13111220016
315 sru008 13111220017
316 sru009 13111220018
317 sru010 13111220019
318 mod 123
319 sru013 13111220022
320 sru014 13111220023
321 sru015 13111220024
322 sru016 13111220025
323 sru017 13111220026
324 sru018 13111220027
325 sru019 13111220028
326 mod 123
327
328 Process returned 0 (0x0) execution time : 0.140 s
329 Press any key to continue.
330
331 */