1 此代码由https://fishc.com.cn/thread-46760-1-1.html转载
2
3 #include<stdio.h>
4 #include<stdlib.h>
5
6 #define OK 1
7 #define ERROR -1
8 #define LEN sizeof(LinkList)
9
10 typedef int Status;
11 typedef int ElemType;
12
13 typedef struct Node//声明结构体 定义单链表 //typedef struct LNode
14 { //{
15 ElemType data; // ElemType data;
16 struct Node *next; // struct LNode *next;
17 }LinkList; //}LinkList;
18
19 LinkList *InitList();
20 Status HeadInsert(LinkList *L);
21 Status PrintList(LinkList *L);
22 Status TailInsert(LinkList *L);
23 Status ListLength(LinkList *L);
24 Status GetElem(LinkList *L);
25 Status LocateElem(LinkList *L);
26 Status ListInsert(LinkList *L);
27 Status ListDelete(LinkList *L);
28 void DestoryLinkList(LinkList **L);
29
30 LinkList *InitList()//初始化结构体(生成带头结点的空链表)
31 { //算法实现
32 LinkList *L; //Status InitList(LinkList *L)
33 L = (LinkList *)malloc(LEN); //{
34 if(L == NULL) // L = new LNode; //生成新结点作为头结点
35 { // L->next = NULL; //头指针的指针域为空
36 printf("内存分配失败"); // return OK;
37 exit(ERROR); //}
38 }
39
40 L->next = NULL;
41
42 return L;
43 }
44
45 Status HeadInsert(LinkList *L)//头插法 //算法实现
46 { //void CreateList_Head(LinkList *L,int n)
47 LinkList *p; //{
48 int i; // L = newLnode;
49 // L->next = NULL;
50 printf("请输入数字<以86结束>:"); // for(i = 0; i < n; i++)
51 scanf("%d",&i); // {
52 while(i != 86) // p = new LNode; //生成新结点*p
53 { // cin>>p->data; //输入元素值赋给新生成的结点
54 p = (LinkList *)malloc(LEN); // p->next = L->next //p的指针域指向头结点的下一个结点的数据域
55 p->data = i; //输入数据 // L->next = p; //头结点的指针域指向p的数据域插入完成
56 p->next = L->next; // }
57 L->next = p; //}
58 scanf("%4d",&i);
59 }
60 return OK;
61 }
62
63 Status PrintList(LinkList *L)//打印
64 {
65 LinkList *p;
66 p = L->next;
67 printf("操作结果是:");
68 while(p != NULL)
69 {
70 printf("%5d",p->data);
71 p = p->next;
72 }
73 printf("\n");
74 return OK;
75 }
76
77 Status TailInsert(LinkList *L) //算法描述
78 { void CreatList_R(LinkList *L,int n)
79 int i; {
80 LinkList *tail,*p; L = new LNode;
81 tail = L; //尾指针的初值为头结点 L->next = NULL;
82 printf("请输入正整数<以86结束>:"); r = L; //尾指针r指向头结点
83 scanf("%d",&i); for(i = 0; i < n; i++)
84 {
85 while(i != 86) p = newLNode;
86 { cin>>p->data;
87 p = (LinkList *)malloc(LEN); p->next = NULL;
88 p->data = i; r->next = p;
89 tail->next = p; //新结点插入到表尾tail之后 r = p;
90 tail = p; //将尾指针tail指向新插入的节点 }
91 scanf("%d",&i); }
92 }
93
94 tail->next = NULL;
95 return OK;
96 }
97
98 Status ListLength(LinkList *L)//测量长度
99 {
100 int i = 0;
101 LinkList *p;
102
103 p = L->next;
104 while(p != NULL)
105 {
106 i++;
107 p = p->next;
108 }
109 printf("线性表的长度为:%d\n",i);
110 return i;
111 }
112
113 Status GetElem(LinkList *L)//获取元素 //算法实现
114 { //Status GetElem(LinkList *L,int i,ElemType &e)
115 int i = 0; //{ 根据序号i获取元素的值 并用e返回
116 int j; // p = L->next;
117 int temp = 0; // while(p != NULL && j<i)
118 LinkList *p,*T; // {
119 T = L->next; // p = p->next;
120 p = L->next; // j++;
121 while(p != NULL)//测量一下线性表的长度 // }
122 { // if(!p || j>i) return ERROR;
123 i++; // e = p->data;
124 p = p->next; // return OK;
125 } //}
126 printf("请输入想要查找元素的位置:");
127 scanf("%d",&j);
128 if(j > i || i < 0)
129 printf("不好意思没那个位置\n");
130
131 while(T != NULL)
132 {
133 temp++;
134 if(temp == j)
135 {
136 printf("第%d位置上的元素是:%d\n",j,T->data);
137 break;
138 }
139 T = T->next;
140 }
141
142 return OK;
143 }
144
145 Status LocateElem(LinkList *L)//定位,按值查找 //算法实现
146 { //LinkList *LocateElem(LinkList L,ElemType e)
147 int i = 0,j,k = 0; //{ //寻找e元素
148 LinkList *p; // p = L->next; //初始化p指向首元结点
149 // while(p && p->data != e)
150 p = L->next; // {
151 printf("请输入想要查找的数据:"); // p = p->next; //扫描
152 scanf("%d",&j); // }
153 while(p != NULL) // return p; //返回e的结点地址p
154 { //}
155 i++;
156 if((p->data) == j)
157 {
158 printf("%d的位置是%d\n",j,i);
159 k = 1;
160 break;
161 }
162
163 p = p->next;
164 }
165 if(k == 0)
166 {
167 printf("你查找的元素不存在啊!\n");
168 }
169
170 return OK;
171 }
172
173 Status ListInsert(LinkList *L)//插入 //算法描述
174 { //Status ListInsert(LinkList *L,int i,Elemtype e)
175 int i,j,k = 0; //{
176 LinkList *p,*q,*r; // p = L;
177 // j = 0;
178 p = L->next; // while(p && (j<i-1))
179 printf("请输入插入的位置以及想要插入的数(无越界检查)"); // {
180 scanf("%d %d",&i,&j); // p = p->next;
181 // j++;
182 q = (LinkList *)malloc(LEN); // }
183 q->data = j; // if(!p || j>i-1) return ERROR;
184 while(p != NULL) // s = new LNode;
185 { // s->data = e;
186 if(i == 1) //如果插在头部的情况 // s->next = p->next;
187 { // p->next = s;
188 q->next = L->next; // return OK;
189 L->next = q; //}
190 break;
191 }
192 else if((k+1) == i)//否则就往后找
193 {
194 q->next = p->next;//数据的指针域指向p的下一个结点
195 p->next = q;
196 break;
197 }
198
199 p= p->next;
200 }
201
202 r = L->next;
203 printf("操作结果是:\n");
204 while(r != NULL)
205 {
206 printf("%5d",(r->data));
207 r = r->next;
208 }
209 printf("\n");
210 return OK;
211 }
212
213 Status ListDelete(LinkList *L) //算法描述
214 { //Status ListDelete(LinkList *L,Elemtype i)
215 int i; //{ //带头结点的链表中删除第i个元素
216 LinkList *p,*q; // p =L;j = 0;
217 // while((p->next) && (j<i-1))
218 p = L->next; // {p = p->next; j++;} //查找第i-1个结点 让p指向它
219 printf("请输入你想要删除的数组<相同的只删除一个>:"); // if(!(p->next) || (j>i-1)) return ERROR;
220 scanf("%d",&i); // q = p->next;
221 while(p != NULL) // p->next = q->next;
222 { // delete q;
223 if(L->next->data == i) //第一个数= // return OK;
224 { // }
225 L->next = L->next->next;
226 break;
227 }
228 else if(p->next->data == i)
229 {
230 p->next = p->next->next;
231 break;
232 }
233
234 p = p->next;
235 }
236
237 q = L->next;
238 printf("操作结果是:");
239 while(q != NULL)
240 {
241 printf("%5d",(q->data));
242 q = q->next;
243 }
244 printf("\n");
245 return OK;
246 }
247
248 void DestoryLinkList(LinkList **L)
249 {
250 LinkList *temp;
251 while(*L != NULL)
252 {
253 temp = *L;
254 *L = (*L)->next;
255 free(temp);
256 }
257 }
258
259 Status main(void) //主函数
260 {
261 int i,j;
262 LinkList *L;
263 L = InitList(); //初始化单链表
264 while(1)
265 {
266 printf("建立单链表:1.头插法 2.尾插法 3.结束\n");
267 printf("请输入操作序号");
268 scanf("%d",&i);
269 if(i == 1)
270 {
271 HeadInsert(L);
272 PrintList(L);
273 break;
274 }
275 else if(i == 2)
276 {
277 TailInsert(L);
278 PrintList(L);
279 break;
280 }
281 else if(i == 3)
282 {
283 exit(0); //代码正常退出 exit(1)为代码为非正常退出
284 }
285 else
286 {
287 printf("输入有误,请重新输入\n");
288 }
289
290 }
291
292 printf("单链表操作:1.求长度 2.按位置求值 3.按值查找 4.插入 5.删除 6.退出\n");
293 while(1)
294 {
295 printf("请输入操作序号:");
296 scanf("%d",&j);
297
298 if(j == 1)
299 {
300 ListLength(L); //测量长度
301 }
302 else if(j == 2)
303 {
304 GetElem(L); //获取元素
305 }
306 else if(j == 3)
307 {
308 LocateElem(L); //定位查找
309 }
310 else if(j == 4)
311 {
312 ListInsert(L); //插入
313 }
314 else if(j == 5)
315 {
316 ListDelete(L); //删除
317 }
318 else if(j == 6)
319 {
320 exit(0);
321 }
322 else
323 {
324 printf("数据输入有误\n");
325 }
326 }
327
328 DestoryLinkList(&L);
329
330 return 0;
331 }