单链表

  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, 0sizeof(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 */

posted on 2014-10-14 21:36  angle_qqs  阅读(212)  评论(0编辑  收藏  举报

导航