数据结构——单链表及其操作

Posted クトリ・ノタ・セニオリス

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——单链表及其操作相关的知识,希望对你有一定的参考价值。

  1 #include<iostream>
  2 #include<string>
  3 #include<stdlib.h>
  4 
  5 using namespace std;
  6 
  7 typedef int ElemType;
  8 typedef int Status;
  9 #define OK 1
 10 #define ERROR 0
 11 
 12 
 13 //单链表的存储结构
 14 typedef struct LNode
 15 {
 16     ElemType data;            //结点的数据域
 17     struct LNode *next;        //结点的指针域
 18 }LNode,*LinkList;            //LinkList为指向结构体LNode的指针类型
 19 
 20 
 21 //初始化
 22 Status InitList(LinkList &L)
 23 {
 24     L = new LNode;    //生成新结点作为头结点,用头指针L指向头结点
 25 
 26     if (!L)            //分配失败
 27         return ERROR;    
 28 
 29     L->next = NULL;    //头结点的指针域置空
 30     return OK;
 31 }
 32 
 33 
 34 //前插法创建单链表
 35 //逆位序输入n个元素的值,建立带表头结点的单链表L
 36 void CreateList_H(LinkList &L,int n)
 37 {
 38     LinkList p;
 39 
 40     L = new LNode;
 41     L->next = NULL;        //先建立一个带头结点的空链表
 42 
 43     cout << "请依次输入" << n << "个元素:" << endl;
 44 
 45     for (int i = 0; i < n; i++)
 46     {
 47         p = new LNode;        //生成新结点*p
 48         cin >> p->data;        //输入元素值赋给新结点*p的数据域
 49         p->next = L->next;
 50         L->next = p;        //将新结点*p插入到头结点之后 (注意次序不能颠倒!!!
 51     }
 52 }
 53 
 54 
 55 //尾插法创建单链表
 56 void CreateList_R(LinkList &L, int n)
 57 {
 58     LinkList s, r;
 59 
 60     L = new LNode;
 61     L->next = NULL;        //先创建一个带头结点的空链表
 62 
 63     r = L;                //尾指针r指向头结点
 64 
 65     cout << "请依次输入" << n << "个元素:" << endl;
 66 
 67     for (int i = 0; i < n; i++)
 68     {
 69         s = new LNode;
 70         cin >> s->data;
 71 
 72         s->next = NULL;
 73         r->next = s;
 74 
 75         r = s;    //更新r的指向,r指向新的尾节点s
 76     }
 77 }
 78 
 79 
 80 //取值
 81 //在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
 82 Status GetElem(LinkList L, int i, ElemType &e)
 83 {
 84     LinkList p;
 85 
 86     p = L->next;    //初始化,p指向首元结点
 87     int j = 1;        //计数器
 88     while (p && j < i)
 89     {
 90         p = p->next;    //p指向下一个结点
 91         j++;
 92     }
 93     if (!p || j > i)
 94         return ERROR;    //i值不合法,i>n 或 i<=0
 95 
 96     e = p->data;
 97     return OK;
 98 }
 99 
100 
101 //查找
102 //在带头结点的单链表L中查找值为e的元素
103 Status LocateElem(LinkList L, ElemType e)
104 {
105     LinkList p;
106 
107     p = L->next;    //初始化,p指向首元结点
108 
109     while (p && p->data != e)    //顺链域向后扫描,直到p为空或p所指向的结点数据域等于e
110     {
111         p = p->next;
112     }
113 
114     if (!p)
115         return ERROR;
116 
117     return OK;    
118 }
119 
120 
121 //插入
122 //在带头结点的单链表L中第i个位置插入值为e的新结点
123 Status ListInsert(LinkList &L, int i, ElemType e)
124 {
125     LinkList p;
126     p = L;
127     int j = 0;
128 
129     while (p && (j < i - 1))    //查找第i-1个结点,p指向该结点
130     {
131         p = p->next;
132         j++;
133     }
134     if (!p || j > i - 1)
135         return ERROR;
136 
137     LinkList s;
138     s = new LNode;
139 
140     s->data = e;
141     s->next = p->next;
142     p->next = s;
143     //注意这里的次序!!!
144 
145     return OK;
146 }
147 
148 
149 //删除
150 //在带头结点的单链表L中,删除第i个元素
151 Status ListDelete(LinkList &L, int i)
152 {
153     LinkList p, q;
154     p = L;
155     int j = 0;
156     while ((p->next) && (j < i - 1))    //查找第i-1个结点,p指向该结点
157     {
158         p = p->next;
159         j++;
160     }
161     if (!(p->next) || (j > i - 1))
162         return ERROR;
163 
164     q = p->next;
165     p->next = q->next;
166 
167     delete q;
168 
169     return OK;
170 }
171 
172 
173 //单链表的输出
174 void print_List(LinkList L)
175 {
176     LinkList p;
177 
178     p = L->next;
179 
180     while (p)
181     {
182         cout << p->data << " ";
183         p = p->next;
184     }
185     cout << endl;
186 }
187 
188 
189 int main()
190 {
191     int i, x, e, n, choose;
192     LinkList L;
193     L = NULL;    //这里不初始化为空,后面操作的时候vs上会报错,不太懂╮(╯▽╰)╭
194 
195     cout << "1. 初始化\n";
196 
197     cout << "2. 前插法创建单链表\n";
198 
199     cout << "3. 尾插法创建单链表\n";
200 
201     cout << "4. 取值\n";
202 
203     cout << "5. 查找\n";
204 
205     cout << "6. 插入\n";
206 
207     cout << "7. 删除\n";
208 
209     cout << "8. 输出\n";
210 
211     cout << "0. 退出\n";
212 
213     choose = -1;
214 
215     while (choose != 0)
216     {
217         cout << "请选择操作:" << endl;
218         cin >> choose;
219 
220         switch (choose)
221         {
222         case 1://初始化
223             if (InitList(L))
224                 cout << "成功初始化一个空的单链表!\n";
225             cout << endl;
226             break;
227 
228         case 2://前插法创建单链表
229             cout << "请输入所要创建的单链表的长度:";
230             cin >> n;
231             CreateList_H(L, n);
232             cout << endl;
233             break;
234 
235         case 3://尾插法创建单链表
236             cout << "请输入所要创建的单链表的长度:";
237             cin >> n;
238             CreateList_R(L, n);
239             cout << endl;
240             break;
241 
242         case 4://单链表的取值
243             cout << "请输入您要选取的元素的位置:";
244             cin >> i;
245             if (GetElem(L, i, e))
246             {
247                 cout << "选取成功!" << endl;
248                 cout << "" << i << "个元素是:" << e << endl;
249             }
250             else
251                 cout << "选取失败!" << endl;
252             cout << endl;
253             break;
254 
255         case 5://单链表的查找
256             cout << "请输入您要查找的元素:";
257             cin >> x;
258             if (LocateElem(L, x))
259                 cout << "查找成功!" << endl;
260             else
261                 cout << "查找失败!" << endl;
262             cout << endl;
263             break;
264 
265         case 6://单链表的插入
266             cout << "请输入选择插入的位置和元素:";
267             cin >> i >> x;
268             if (ListInsert(L, i, x))
269                 cout << "插入成功!" << endl;
270             else
271                 cout << "插入失败!" << endl;
272             cout << endl;
273             break;
274 
275         case 7://单链表的删除
276             cout << "请输入所要删除的元素位置:";
277             cin >> i;
278             if (ListDelete(L, i))
279                 cout << "删除成功!" << endl;
280             else
281                 cout << "删除失败!" << endl;
282             cout << endl;
283             break;
284 
285         case 8://单链表的输出
286             cout << "当前单链表中元素为:" << endl;
287             print_List(L);
288             cout << endl;
289             break;
290         }
291     }
292     return 0;
293 }

 

以上是关于数据结构——单链表及其操作的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之单链表的增删查改等操作画图详解

认识链表以及其常见操作Java代码实现

单链表及其基本操作

单链表的实现及其基本操作

[C语言]单链表及其基本操作

栈的简单实现-单链表实现