单链表的创建与操作
1、创建一个带头结点的单链表(头指针为head),输出链表中各结点的值;
2、查找单链表中的第i个结点,并输出结点元素的值;
3、在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入)
4、删除单链表中的第j个结点;
5、将单链表中的各结点就地逆序(不重建另外的一个链表);
6、输出链表中所有元素
7、将单链表中的负数移动到链表尾
0、退出
程序代码如下:
1 /*
2 *快速学习单链表的及其操作
3 *AUTHOR:CplusHua
4 *DATE:2012-10-28 DATE :2012-12-09
5 * 加入将链表中的元素移动到链表尾的功能
6 *Vertion:0.1.1
7 */
8 #include<iostream>
9 #include "malloc.h"
10 #include <stdio.h>
11 #define ElemType int
12 using namespace std;
13 //定义线性表的单链表存储结构
14 typedef struct Lnode{
15 ElemType data;
16 struct Lnode *next;
17 }Lnode,*LinkList;
18 enum Status
19 {
20 OK,FAILED,NULLHEAD
21 };
22 //单链表初始化
23 LinkList LinkListInit()
24 {
25 LinkList head;
26 head=(Lnode *)malloc(sizeof(Lnode));
27 if(NULL==head)
28 cout<<"申请空间失败!";
29 head->next=NULL;
30 head->data=0;
31 return head;
32 }
33 //创建单链表,增加元素
34 Status LinkList_Create(LinkList head,ElemType e)
35 {
36 LinkList q;
37 q=head;
38 while(q->next!=NULL)
39 q=q->next;
40 q->next=(Lnode *)malloc(sizeof(Lnode));
41 q->next->data=e;
42 q->next->next=NULL;
43 head->data++;
44 return OK;
45 }
46 //输出单链表中的元素
47 Status LinkList_Cout(LinkList head)
48 {
49 if(NULL==head->next)
50 {
51 cout<<"您还没有向单链表中插入任何元素!"<<endl;
52 return NULLHEAD;
53 }
54 LinkList p;
55 p=head->next;
56 while(NULL!=p->next)
57 {
58 cout<<p->data<<" ";
59 p=p->next;
60 }
61 cout<<p->data<<endl;
62 return OK;
63 }
64 //查找单链表中的第i个结点,并输出结点元素的值
65 Status LinkList_Search(LinkList head,int i,ElemType *e)
66 {
67 if(NULL==head->next)
68 {
69 cout<<"您还没有向单链表中插入任何元素!"<<endl;
70 return NULLHEAD;
71 }
72 if(i>head->data)
73 {
74 cout<<"请输入正确的范围!"<<endl;
75 return FAILED;
76 }
77 LinkList p;
78 p=head->next;
79 while(i--!=1)
80 {
81 if(NULL==p->next)
82 {
83 cout<<"超出结点范围"<<endl;
84 return FAILED;
85 }
86 p=p->next;
87 }
88 *e=p->data;
89 return OK;
90
91 }
92 //在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入)
93 Status LinkList_Insert(LinkList head,int i,ElemType e)
94 {
95 if(NULL==head->next)
96 {
97 cout<<"您还没有向单链表中插入任何元素!"<<endl;
98 return NULLHEAD;
99 }
100 if(i>head->data)
101 {
102 cout<<"请输入正确的范围!"<<endl;
103 return FAILED;
104 }
105 LinkList p,q;
106 p=head;
107 while(i-->1)
108 {
109 p=p->next;
110 }
111 q=(Lnode *)malloc(sizeof(Lnode));
112 q->next=p->next;
113 q->data=e;
114 p->next=q;
115 head->data++;
116 return OK;
117 }
118 //删除单链表中的第j个结点
119 Status LinkList_Delete(LinkList head,int i,ElemType *e)
120 {
121 if(NULL==head->next)
122 {
123 cout<<"您还没有向单链表中插入任何元素!"<<endl;
124 return NULLHEAD;
125 }
126 if(i>head->data)
127 {
128 cout<<"请输入正确的范围!"<<endl;
129 return FAILED;
130 }
131
132 LinkList p,q;
133 p=head;
134 while(i-->1)
135 {
136 p=p->next;
137 }
138 q=p->next->next;
139 *e=p->next->data;
140 free(p->next);
141 p->next=q;
142 head->data--;
143 return OK;
144 }
145 //将单链表中的各结点就地逆序(不允许另建一个链表)
146 Status LinkList_Revorder(LinkList head)
147 {
148 if(NULL==head->next)
149 {
150 cout<<"您还没有向单链表中插入任何元素!"<<endl;
151 return NULLHEAD;
152 }
153 if(1==head->data) return OK; //只有一个元素不需要逆序
154 LinkList p,q,tmp;
155 p=head->next;
156 q=p->next;
157 while(1)
158 {
159 if(NULL==q->next)//只剩下两个元素的时候q->next为NULL
160 {
161 q->next=p;
162 break;
163 }
164 tmp=q->next;
165 q->next=p;
166 p=q;
167 q=tmp;
168
169 }
170 head->next->next=NULL;
171 head->next=q;
172 return OK;
173 }
174 //将链表中的所有负数结点移至链表尾
175 Status LinkList_Movtoend(LinkList head)
176 {
177 if(NULL==head->next)
178 {
179 cout<<"您还没有向单链表中插入任何元素!"<<endl;
180 return NULLHEAD;
181 }
182 LinkList p=head;
183 LinkList q=head;
184 while(q->next!=NULL) q=q->next;//q=rear (链表尾,作为已知条件)
185 LinkList rear=q;//链表尾
186 while(p->next!=q)
187 {
188 if(p->next->data<0)
189 {
190 rear->next=p->next;
191 p->next=p->next->next;
192 rear=rear->next;
193 rear->next=NULL;
194 }
195 else p=p->next;
196 }
197 if(p->next->data<0)
198 {
199 rear->next=p->next;
200 p->next=p->next->next;
201 rear=rear->next;
202 rear->next=NULL;
203 }
204 else p=p->next;
205 return OK;
206 }
207 int main()
208 {
209 LinkList head=LinkListInit();
210 int opt,n=0,m=0,i=0;
211 ElemType e;
212 while(1)
213 {
214
215 if(n)
216 {
217 while(getchar()!='\n'&&getchar()!=' ');
218 while(getchar()!='\n'&&getchar()!=' ');
219 }
220 n=1;
221 cout<<"************请输入您要进行的操作的编号************"<<endl<<endl;
222 cout<<"1.创建一个带头结点的单链表(头指针为head),且遍历此链表(输出链表中各结点的值)"<<endl;
223 cout<<"2.查找单链表中的第i个结点,并输出结点元素的值"<<endl;
224 cout<<"3.在单链表中的第i个结点前插入一个结点值为e的正整数(从外部输入)"<<endl;
225 cout<<"4.删除单链表中的第j个结点"<<endl;
226 cout<<"5.将单链表中的各结点就地逆序(不允许另建一个链表)"<<endl;
227 cout<<"6.输出单链表中的元素"<<endl;
228 cout<<"7.将单链表中的负数移动到链表尾"<<endl;
229 cout<<"0.退出"<<endl<<endl;
230 cout<<"***************************************************"<<endl;
231 cin>>opt;
232 switch (opt)
233 {
234 case 1:
235 cout<<"请输入您要创建的链表的节点个数"<<endl;
236 cin>>m;
237 for(i=0;i<m;i++)
238 {
239 cin>>e;
240 LinkList_Create(head,e);
241 }
242 cout<<"单链表创建成功!"<<endl;
243 cout<<"此时的单链表为:";
244 LinkList_Cout(head);
245 break;
246 case 2:
247 cout<<"请输入要查找的元素位置i"<<endl;
248 cin>>i;
249 if(OK==LinkList_Search(head,i,&e))
250 cout<<"您要查找的元素是: "<<e<<endl;
251 break;
252 case 3:
253 cout<<"请输入要插入元素的位置和元素"<<endl;
254 cout<<"位置:"<<endl;
255 cin>>i;
256 cout<<"元素"<<endl;
257 cin>>e;
258 if(OK==LinkList_Insert(head,i,e))
259 cout<<"数据插入成功!"<<endl;
260 cout<<"此时的单链表为:";
261 LinkList_Cout(head);
262 break;
263 case 4:
264 cout<<"请输入要删除的节点的位置"<<endl;
265 cin>>i;
266 if(OK==LinkList_Delete(head,i,&e))
267 cout<<"元素"<<e<<"已经成功删除!"<<endl;
268 cout<<"此时的单链表为:";
269 LinkList_Cout(head);
270 break;
271 case 5:
272 LinkList_Revorder(head);
273 cout<<"逆序成功!"<<endl;
274 cout<<"此时的单链表为:";
275 LinkList_Cout(head);
276 break;
277 case 6:
278 LinkList_Cout(head);
279 break;
280 case 7:
281 LinkList_Movtoend(head);
282 cout<<"所有负数已经移动到链表尾!"<<endl;
283 cout<<"此时的单链表为:";
284 LinkList_Cout(head);
285 break;
286 case 0:
287 return 0;
288 default:
289 cout<<"ERROR"<<endl;
290 }
291 }
292 return 0;
293 }