1. //程序模块
2. #include <iostream>
3. #include <stdio.h>
4. #include <stdlib.h>
5. #include <conio.h>
6. using namespace std;
7. typedef int DataType;
8. typedef struct LNode
9. {
10. DataType data;
11. struct LNode *next;
12. }LNode ,*LinkList;
13.
14. //全体子函数声明,像这种这么多子函数的程序为了管理也可以做一个目录子函数(有空再弄,吃饭去)
15. void InitLink(LinkList &L);
16. int CreatLink(LinkList &L);
17. int PushLink(LinkList &L);
18. int DeleteLink(LinkList &L);
19. int SearchLink(LinkList L);
20. int ShowLink(LinkList L);
21. int SortLink(LinkList &L);
22. int TogetherLink(void);
23. int SeparateLink(LinkList &L);
24.
25. int main(void)
26. {
27. LinkList L;
28. InitLink(L); //初始化
29. CreatLink(L); //建立链表
30. ShowLink(L); //遍历显示链表
31. PushLink(L); //插入节点
32. ShowLink(L); //遍历显示链表
33. DeleteLink(L); //删除节点
34. ShowLink(L); //遍历显示链表
35. SearchLink(L); //查找节点
36. SortLink(L); //排序
37. SeparateLink(L); //拆分链表
38. getch(); //取任意字符
39. system("cls"); //清空屏幕
40. TogetherLink(); //合并链表
41.
42. return 0;
43. }
44.
45.
46. //初始化链表
47. void InitLink(LinkList &L)
48. {
49. L=(LinkList)malloc(sizeof(LNode));
50. if(L==NULL)
51. {
52. exit(0);
53. }
54. L->data=0;
55. L->next=NULL;
56. }
57.
58. //创建单链表
59. int CreatLink(LinkList &L)
60. {
61. int i;
62. LinkList q;
63. q=L;
64. printf("请输入链表长度:");
65. scanf("%d",&L->data);
66. printf("请输入%d个数据:",L->data);
67. fflush(stdin);
68. for(i=0;i<L->data;i++)
69. {
70. LinkList p;
71. p=(LinkList)malloc(sizeof(LNode));
72. if(p==NULL)
73. {
74. exit(0);
75. }
76. p->next=NULL;
77. // scanf("%d ",&p->data); //为什么这里用C格式输入会出问题呢??
78. cin>>p->data;
79. q->next=p;
80. q=q->next;
81. }
82. return 0;
83. }
84.
85. //选择任意位置插入节点
86. int PushLink(LinkList &L)
87. {
88. int i;
89. LinkList p,q;
90. p=L;
91. printf("插入位置:");
92. scanf("%d",&i);
93.
94. q=(LinkList)malloc(sizeof(LNode));
95. if(q==NULL)
96. {
97. exit(0);
98. }
99. q->next=NULL;
100. printf("插入数据:");
101. scanf("%d",&q->data);
102. while(--i)
103. {
104. p=p->next;
105. }
106. if(!p->next) //考虑在最后的位置插入
107. {
108. p->next=q;
109. }
110. else
111. {
112. q->next=p->next;
113. p->next=q;
114. }
115.
116. return 0;
117. }
118.
119.
120. //选择任意位置删除节点
121. int DeleteLink(LinkList &L)
122. {
123. int i;
124. LinkList p,q;
125. p=L;
126. printf("删除位置:");
127. scanf("%d",&i);
128. while(--i)
129. {
130. p=p->next;
131. }
132. if(!p->next->next) //考虑删除的是最后一个元素
133. {
134. free(p->next->next);
135. p->next=NULL;
136. }
137. else
138. {
139. q=p->next; //q的作用就是为了释放空间
140. p->next=p->next->next;
141. free(q);
142. }
143. return 0;
144. }
145.
146. //查找节点是否在链表中并指出位置
147. int SearchLink(LinkList L)
148. {
149. int data,count=0;
150. LinkList p;
151. p=L;
152. printf("请输入你要查找的元素:");
153. scanf("%d",&data);
154. do
155. {
156. p=p->next;
157. count++;
158. if(p->data==data)
159. {
160. printf("查找成功,该数第一次出现是在链表中第%d位置处。/n",count);
161. return 0;
162. }
163. }while(p->next);
164. printf("查找失败,该数不存在链表中!/n");
165. return 0;
166. }
167.
168. //遍历结果
169. int ShowLink(LinkList L)
170. {
171. LinkList p;
172. p=L->next;
173. while(p->next!=NULL)
174. {
175. printf("%d ",p->data);
176. p=p->next;
177. }
178. printf("%d/n",p->data);
179. return 0;
180. }
181.
182.
183. //链表数据排序--选择排序法
184. int SortLink(LinkList &L)
185. {
186. int temp;
187. LinkList p,q;
188. /* 注意:for的使用不能比较最后一个数,如果要用for那么可以先在尾节点处插入一个空数据
189. for(p=L->next;p->next->next!=NULL;p=p->next)
190. {
191. for(q=p->next;q->next!=NULL;q=q->next)
192. {
193. if(p->data>q->data)
194. {
195. temp=p->data;
196. p->data=q->data;
197. q->data=temp;
198. }
199. }
200. }
201. */
202. p=L->next;
203. do{
204. q=p->next;
205. do
206. {
207. if(p->data>q->data)
208. {
209. temp=p->data;
210. p->data=q->data;
211. q->data=temp;
212. }
213. q=q->next;
214. }while(q); //要比到最后一个的
215.
216. p=p->next;
217. }while(p->next); //注意两个while里面的条件
218.
219. printf("排序后链表为:/n");
220. ShowLink(L);
221. return 0;
222. }
223.
224. //合并链表
225. int TogetherLink(void)
226. {
227. LinkList L,T,S,p; //将链表L和T合并成链表S且不改变L和T本身
228. InitLink(L);
229. InitLink(T);
230. printf("合并链表的第一个链表L信息:/n");
231. CreatLink(L);
232. printf("合并链表的第二个链表T信息:/n");
233. CreatLink(T);
234. p=L;
235. S=p;
236. while(p->next)
237. {
238. p=p->next;
239. }
240. p->next=T->next;
241. printf("合并后的链表S如下:/n");
242. ShowLink(S);
243. return 0;
244. }
245.
246. //拆分链表
247. int SeparateLink(LinkList &L)
248. {
249. LinkList A,B,p; //将L拆分成A,B两个链表
250. B=(LinkList)malloc(sizeof(LNode));
251. if(B==NULL)
252. {
253. exit(0);
254. }
255. int i;
256. printf("拆分的位置:");
257. scanf("%d",&i);
258. p=L;
259. A=p;
260. while(i<=0||i>=L->data)
261. {
262. printf("输入错误,请重新输入:");
263. scanf("%d",&i);
264. }
265. while(i--)
266. {
267. p=p->next;
268. }
269. B->next=p->next;
270. p->next=NULL;
271. printf("链表一:");
272. ShowLink(A);
273. printf("链表二:");
274. ShowLink(B);
275. return 0;
276. }
277.
278. 这是我最近写的一个关于单链表的程序,但是在创建单链表函数中的那处用C语言输入数据时出一些问题。本来应该测试输入5个数据,那么输入5个数据后就立即执行的,但是程序运行时要输入6个数据按回车键后才开始执行。并且读出来的跳过了第五个数据,个人始终想不明白这是为什么,起初以为是不是缓冲区残留问题。但是加上了清除缓冲的语句后还是不行,最后只好改成C++的输入形式了。路过的高手要是知道为什么会这样,希望能够告知一下,本人由衷感谢。
279. PS:C语言的输入用于排版还是很方便的,但是有些时候总是出现一些莫名其妙的问题。由于是自学的一点点C语言所以很多不明白,不过我还是很喜欢C语言的。