1 /*
2 1.带头结点L的单链表结构
3 2.参照严慧敏单链表的链表结构
4
5 Levi
6 date:13.1.22
7 */
8
9 #include <stdio.h>
10 #include "sys/malloc.h"
11 #include <stdlib.h>
12 #define ElemType int
13
14
15 struct LNode{
16 ElemType data;
17 struct LNode * next;
18 };
19
20 typedef struct LNode * LinkList;
21
22 void InitList(LinkList *L){
23 *L=(LinkList)malloc(sizeof(struct LNode));
24 if(!(*L))
25 printf("Failed to allocate memory for L !!!");
26 (*L)->next=NULL;
27 }
28
29 void DestroyList(LinkList *L){
30 LinkList p;
31 while(*L){
32 p=(*L)->next;
33 free(*L);
34 *L=p;
35 }
36 }
37
38 void ClearList(LinkList L){
39 LinkList p,q;
40 p=L->next;
41 while(p){
42 q=p->next;
43 free(p);
44 p=q;
45 }
46 L->next=NULL;
47 }
48
49 void ListEmpty(LinkList L){
50 if(L->next)
51 printf("The LinkList is not NULL\n");
52 else
53 printf("The LinkList is NULL\n");
54
55 }
56
57 int ListLength(LinkList L){
58 int i=1;
59 LinkList q;
60 q=L->next;
61 while(q->next){
62 q=q->next;
63 ++i;
64 }
65 return i;
66 }
67
68 int GetElem(LinkList L,int i,ElemType *e){
69 LinkList p;
70 p=L->next;
71 int count=1;
72 while(p&&count<i){
73 p=p->next;
74 ++count;
75 }
76 if(!p||count>i){
77 printf("The GetElem is failure !!!\n");
78 return -1;
79 }
80 *e=p->data;
81 return 0;
82 }
83
84 int LocateElem(LinkList L,ElemType x){
85 LinkList p;
86 p=L->next;
87 int count=1;
88 while(p->data!=x&&p){
89 ++count;
90 p=p->next;
91 }
92 if(!p){
93 printf("The linkList have not the Element .\n");
94 return -1;
95 }
96 return count;
97 }
98
99 int ListInsert(LinkList L,int i,ElemType e){
100 LinkList p;
101 p=L->next;
102 LinkList s=(LinkList)malloc(sizeof(struct LNode));
103 if(!s){
104 printf("S error!\n");
105 return -1;
106 }
107 if(i==1){
108 s->data=e;
109 s->next=p;
110 L->next=s;
111 return 0;
112 }
113 int count=1;
114 while(p&&count<i-1){
115 p=p->next;
116 ++count;
117 }
118 if(!p||count>i-1){
119 printf("Insert failure .\n");
120 return -1;
121 }
122 s->data=e;
123 s->next=p->next;
124 p->next=s;
125 return 0;
126 }
127
128 int ListDelete(LinkList L,int i,ElemType *e){
129 LinkList p,q;
130 p=L->next;
131 int count=1;
132 // if (i<1||i>ListLength(L)){
133 // printf("i is error !\n");
134 // return 0;
135 // }
136 if (i==1){
137 L->next=p->next;
138 *e=p->data;
139 free(p);
140 return 0;
141 }
142 while(p&&count<i-1){
143 p=p->next;
144 ++count;
145 }
146 if(!p||count>i-1){
147 printf("Delete failure.\n");
148 return 0;
149 }
150 q=p->next;
151 *e=q->data;
152 p->next=q->next;
153 free(q);
154 q=NULL;
155 return 0;
156 }
157
158 void print(ElemType c){
159 printf("%d ",c);
160 }
161
162 void print(ElemType c);
163 void ListTraverse(LinkList L,void(* vi)(ElemType)){
164 LinkList p=L->next;
165 while(p){
166 vi(p->data);
167 p=p->next;
168 }
169 printf("\n");
170 }
171
172
173
174 void CreateList(LinkList *L,int n){
175 int i;
176 LinkList p;
177 *L=(LinkList)malloc(sizeof(struct LNode));
178 (*L)->next=NULL;
179 printf("Please input Link_len = %d : \n",n);
180 for(i=n;i>0;--i){
181 p=(LinkList)malloc(sizeof(struct LNode));
182 scanf("%d",&p->data);
183 p->next=(*L)->next;
184 (*L)->next=p;
185 }
186 }
187
188 void CreateList1(LinkList *L,int n){
189 int i;
190 LinkList p,q;
191 (*L)=(LinkList)malloc(sizeof(struct LNode));
192 (*L)->next=NULL;
193 q=(*L);
194 printf("Please input Link_len = %d : \n",n);
195 for(i=n;i>0;--i){
196 p=(LinkList)malloc(sizeof(struct LNode));
197 scanf("%d",&p->data);
198 q->next=p;
199 q=q->next;
200 }
201 p->next=NULL;
202 }
203
204 void MergeList(LinkList La,LinkList Lb,LinkList *Lc){
205 LinkList pa=La->next,pb=Lb->next,pc;
206 *(Lc)=pc=La;
207 while(pa&&pb){
208 if(pa->data<=pb->data){
209 pc->next=pa;
210 pc=pa;
211 pa=pa->next;
212 }
213 else{
214 pc->next=pb;
215 pc=pb;
216 pb=pb->next;
217 }
218 pc->next=pa?pa:pb;
219 free(Lb);
220 Lb=NULL;
221 }
222 }
223
224 int main(){
225 LinkList La,Lb,Lc;
226
227 InitList(&L);
228 int j;
229 for(j=1;j<=5;j++){
230 ListInsert(L,1,j);
231 }
232 ListTraverse(L,print);
233 ListEmpty(L);
234 int e;
235 ListDelete(L,41,&e);
236 ListTraverse(L,print);
237 printf("%d\n",e);
238 printf("********\n");
239 printf("%d\n",ListLength(L));
240 ListEmpty(L);
241
242 printf("********\n");
243 GetElem(L,4,&e);
244 printf("%d\n",e);
245
246 printf("********\n");
247 int dis=LocateElem(L,2);
248 printf("%d",dis);
249
250 int n=5;
251 CreateList1(&La,n);
252 ListTraverse(La,print);
253 CreateList1(&Lb,n);
254 ListTraverse(Lb,print);
255 MergeList(La,Lb,&Lc);
256 ListTraverse(Lc,print);
257
258 scanf("%*s");
259
260 return 0;
261 }