码迷,mamicode.com
首页 > 其他好文 > 详细

链表的创建

时间:2015-09-04 07:18:40      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

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

 

链表的创建

标签:

原文地址:http://www.cnblogs.com/wangmengmeng/p/4781029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!