链表调通
数据结构-链表
新手学习,代码还很死板,不灵活。期待改进。
环境:vc6
语言:c
运行结果: $ 为结束符号,不会读入$
qwe$ 全部元素为:qwe 一共有:3个元素 查找节点的内容,元素序号为:2 2:w 查找节点的位置,内容为:e e:3 删除节点,节点的位置:1 删除内容为:q 剩余元素为:we 在i插入e:2r 全部元素为:wre 排序后元素为:erw 新链表q:ert$ q合并p后:全部元素为:erwert Press any key to continue
全部代码:
1 #include "stdio.h"
2 #include "malloc.h"
3 #include "string.h"
4
5 typedef struct Node
6 {
7 char data;
8 struct Node * next;
9 }Node, *LinkList;/* LinkList为结构指针类型*/
10
11 //创建一个链表
12 LinkList CreateFromHead();//头插
13 LinkList CreateFromTail(); //尾插/*将新增的字符追加到链表的末尾*/
14
15 int ListLength(LinkList L); //L为带头结点的链表求长度
16 //查找
17 Node * Get2(LinkList L, int i);//按元素序号查找
18 Node *Locate2(LinkList L,char key);//按元素值查找
19 void Get1(LinkList L, int i);//按元素序号查找
20 void Locate1(LinkList L,char key);//按元素值查找
21 //更改
22
23 //删除
24 void DelList(LinkList L,int i,char *e);//删除结点 序号
25 //插入
26 void InsList(LinkList L,int i,char e);//插入结点
27 //合并
28 LinkList Merge(LinkList LA, LinkList LB);
29 //排序
30 void sore(LinkList head);
31 //打印
32 void printList(LinkList L);
33
34 //合并 有序
35 LinkList MergeLinkList(LinkList LA, LinkList LB);//两个从小到大有序链表合并成为有序链表 LC
36
37 int main()
38 { /* LinkList为结构指针类型*/
39 Node *p, *q;
40 char c, e;
41 int i;
42
43 p = (Node*)malloc(sizeof(Node));
44 p = CreateFromTail();
45
46 printf("全部元素为:");
47 printList(p);
48 printf("\n一共有:%d个元素\n", ListLength(p));
49
50 //查找
51 printf("查找节点的内容,元素序号为:");
52 scanf("%d", &i);
53 Get1(p, i);
54 printf("查找节点的位置,内容为:");
55 scanf(" %c", &c);
56 Locate1(p,c);
57 //删除
58 printf("删除节点,节点的位置:");
59 scanf("%d", &i);
60 DelList(p,i,&e);
61 printf("删除内容为:%c\n", e);
62 printf("剩余元素为:");
63 printList(p);
64 printf("\n");
65 //插入
66 printf("在i插入e:");
67 scanf("%d%c", &i, &e);
68 InsList(p,i,e);
69 printf("全部元素为:");
70 printList(p);
71 printf("\n");
72
73 //排序
74 sore(p);
75 printf("排序后元素为:");
76 printList(p);
77 printf("\n");
78
79 printf("新链表q:");
80 q = (Node*)malloc(sizeof(Node));
81 q = CreateFromTail();
82
83 //合并
84 printf("q合并p后:");
85 //q 为NULL !!
86 p = Merge(p, q);
87
88 printf("全部元素为:");
89 printList(p);
90 printf("\n");
91 /*
92 //有序合并
93 p = MergeLinkList(q, p);
94 printf("合并后全部元素为:");//(原来的两个链表本来就有序,p长度短)
95 printList(p);
96 printf("\n");
97 */
98
99 return 0;
100 }
101
102
103
104
105
106 //头插
107 LinkList CreateFromHead()
108 {
109 int flag=1;
110 LinkList L;
111 Node *s;
112 char c;
113 L=(LinkList)malloc(sizeof(Node));
114 L->next=NULL;
115
116 while(flag) //因为flag是1,所以进入循环体执行
117 {
118 scanf("%c", &c);
119 //c = getchar(); //假设用户输入ab$,首先读入'a’
120 if(c !='$') //'a’不等于'$’,因此判断成立
121 {
122 s=(Node*)malloc(sizeof(Node));
123 s->data=c;
124 s->next=L->next;
125 L->next=s;
126 }
127 }
128 return L;
129 }
130 //尾插
131 LinkList CreateFromTail() /*将新增的字符追加到链表的末尾*/
132 {
133 char c;
134 LinkList L;
135 Node *r, *s;
136 L=(LinkList)malloc(sizeof(Node));
137 L->next=NULL;
138 r=L; /*r指针始终动态指向链表的当前表尾*/
139 fflush(stdin);
140 c=getchar();
141 while(c!='$')/*输入“$”时flag为0,建表结束*/
142 {
143
144 s=(LinkList)malloc(sizeof(Node));
145 s->data=c;
146 r->next=s;
147 r=s;
148 c=getchar();
149 }
150 r->next=NULL;
151 return L;
152 }
153 //按元素序号查找
154 void Get1(LinkList L, int i)
155 { //假设开始的情况是:
156 Node *p;
157 int j=0;
158 p=L;
159 while((p->next!=NULL)&&(j<i))
160 {
161 p=p->next;
162 j++;
163 }
164 // p->next是NULL
165 if(i==j)
166 {
167 printf("%d:%c\n", i,p->data);
168 }
169 else //不满足判断条件,因此执行else部分
170 printf("未找到");
171 }
172
173 //按元素值查找
174 void Locate1(LinkList L,char key)
175 {
176 int i = 1;
177 Node *p;
178 p=L->next;
179 while(p !=NULL)
180 {
181 if(p->data != key)
182 {
183 i++;
184 p=p->next;
185 }
186 else
187 {
188 printf("%c:%d\n", key, i);
189 break;
190 }
191 }
192 }
193
194
195 //按元素序号查找
196 Node *Get2(LinkList L, int i)
197 { //假设开始的情况是:
198 Node *p;
199 int j=0;
200 p=L;
201 while((p->next!=NULL)&&(j<i))
202 { //满足条件,因此进入循环体执行
203 p=p->next;
204 j++;
205 }
206 // p->next是NULL,不满足条件,因此不再执行循环体
207 if(i==j)
208 {
209 printf("%d:%c\n", i,p->data);
210 return p;
211 }
212 else //不满足判断条件,因此执行else部分
213 return NULL;
214 }
215
216 //按元素值查找
217 Node *Locate2(LinkList L,char key)
218 {
219 int i = 1;
220 Node *p;
221 p=L->next;
222 while(p !=NULL)
223 {
224 if(p->data != key)
225 {
226 i++;
227 p=p->next;
228 }
229 else
230 {
231 printf("%c:%d\n", key, i);
232 break;
233 }
234 }
235 return p;
236 }
237
238 //删除结点
239 void DelList(LinkList L,int i,char *e)
240 {
241 Node *p,*r;
242 int k =0;
243 p=L;
244 while(p->next != NULL && k < i-1)
245 {
246 p=p->next;
247 k=k+1;
248 }
249 if(k!=i-1)
250 {
251 printf("无此节点");
252 }
253 else
254 {
255 r=p->next;
256 p->next=p->next->next;
257 *e=r->data;//通过变量e返回删掉的元素值
258 free(r); //r这个变量及值都没有变动,但是不能再使用r指向的那个空间(因为已经释放)。
259 }
260 }
261 //插入结点
262 void InsList(LinkList L,int i,char e)
263 {
264 Node *pre,*s;
265 int k=0;
266 pre=L;
267 while(pre!=NULL&&k<i-1) /*先找到第i-1个数据元素的存储位置,使指针pre指向它*/
268 {
269 pre=pre->next;
270 k=k+1;
271 }
272 if(k!=i-1)
273 {
274 printf("插入位置不合理!");
275 return;
276 }
277 s=(Node*)malloc(sizeof(Node));/*为e申请一个新的结点*/
278 s->data=e; /*将待插入结点的值e赋给s的数据域*/
279 s->next=pre->next;
280 pre->next=s;
281 }
282
283
284
285 //求长度
286 int ListLength(LinkList L) /*L为带头结点的链表*/
287 {
288 Node *p;
289 int j=0; /*用来存放链表的长度*/
290 p=L->next;
291 while(p!=NULL)
292 {
293 p=p->next;
294 j++;
295 }
296 return j;
297 }
298
299
300 //合并
301 LinkList Merge(LinkList LA, LinkList LB)
302 {
303 LinkList p;
304 p = LA->next;
305 while(p->next)
306 p = p->next;
307 p->next = LB->next;
308 free(LB);
309 return LA;
310 }
311 //两个从小到大有序链表合并成为有序链表 LC
312 LinkList MergeLinkList(LinkList LA, LinkList LB)
313 {
314 Node *pa,*pb;
315 LinkList LC;
316 LinkList r;
317
318 pa=LA->next;
319 pb=LB->next;
320 LC=LA;
321 LC->next=NULL;
322 r=LC;
323
324 while(pa!=NULL && pb!=NULL)
325 {
326 if(pa->data <= pb->data)
327 {
328 r->next=pa;
329 r=pa;
330 pa=pa->next;
331 }
332 else
333 {
334 r->next=pb;
335 r=pb;
336 pb=pb->next;
337 }
338 }
339 if(pa != NULL)
340 r->next=pa;
341 //return NULL;
342 else//
343 r->next=pb;
344 free(LB);
345 return (LC);
346 }
347 /*
348 bcd$
349 新链表q:aef$
350 合并后全部元素为:abcdef
351 bc$
352 新链表q:adef$
353 合并后全部元素为:abcdef
354 acdg$
355 新链表q:be$
356 合并后全部元素为:abcdeg
357 */
358 //排序
359 void sore(LinkList head)
360 {
361 LinkList pre,cur,next,end, temp;
362 end = NULL;
363 while(head->next != end)
364 {
365 //初始化三个指针 ; 判断是否到达结束位置 ; 三个指针集体后移
366 for(pre=head,cur=pre->next,next=cur->next; next!=end; pre=pre->next,cur=cur->next,next=next->next)
367 {
368 if(cur->data > next->data) //从小到大
369 {
370 pre->next=next;
371 cur->next=next->next;
372 next->next=cur;
373 //此时next变前一项,cur变后一项 交换next cur
374 temp=cur;
375 cur=next;
376 next=temp;
377 }
378 }
379 //一轮循环结束 最后一项已经排好 end提前一项 (冒泡原理)
380 end = cur;
381 }
382 }
383
384 void printList(LinkList L)
385 {
386 Node *p = L;
387 while(p->next)
388 {
389 p = p->next;
390 if(p->data >= 'a' || p->data <='z')
391 printf("%c", p->data);
392 //printf(" ", p->data);
393 }
394 }
赞 (0)
