快速学习单链表的创建和操作(包含程序和程序注解)

主要实现的功能如下:

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 }

 我的博客:http://hua.219.me 欢迎来访!

posted @ 2012-12-09 13:51  VierAmt  阅读(1245)  评论(2编辑  收藏  举报