数据结构实验2——链表

Posted moomight

tags:

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

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <windows.h>
  7 #include <cwchar>
  8 #include <string>
  9 
 10 using namespace std;
 11 
 12 #define ok 1
 13 #define error 0
 14 #define overflow -2
 15 
 16 const int maxn = 1e5 + 10;
 17 struct student
 18     char id[80];
 19     char name[80];
 20     double grade;
 21 e, ss;
 22 
 23 typedef struct lnode
 24     student data;
 25     struct lnode *next;
 26     int length;
 27 lnode, *linklist;
 28 
 29 linklist l, s;
 30 string head1, head2, head3;
 31 int length;
 32 
 33 //初始化链表
 34 int initlist(linklist &ll)
 35     ll = new lnode;
 36     ll->next = nullptr;
 37     ll->length = 0;
 38     return ok;
 39 
 40 
 41 //前插法构建链表
 42 int createlist_before(linklist &ll, int n)
 43    ll = new lnode;
 44    l->next = nullptr;
 45    for(int j = 0; j < n; j ++ )
 46        auto r = new lnode;
 47        cin>>r->data.id>>r->data.name>>r->data.grade;
 48        r->next = ll->next;
 49        ll->next = r;
 50        ll->length ++ ;
 51    
 52    return ok;
 53 
 54 
 55 //获取
 56 int getelem(linklist ll, int i)
 57     auto p = ll->next;
 58     int j = 1;
 59     while(p && j < i)
 60         p = p->next;
 61         j ++ ;
 62     
 63     if(!p->next || j > i) return error;
 64     ss = p->data;
 65     return ok;
 66 
 67 
 68 //后插法创建单链表
 69 int createlist_after(linklist &ll, int n)
 70     ll = new lnode;
 71     ll->next = nullptr;
 72     auto r = ll;
 73     for(int j = 0; j < n; j ++ )
 74         auto u = new lnode;
 75         cin>>r->data.id>>r->data.name>>r->data.grade;
 76         u->next = nullptr;
 77         r->next = u;
 78         r = u;
 79         ll->length ++ ;
 80     
 81     return ok;
 82 
 83 
 84 //显示链表内容
 85 int listdisplay(linklist ll)
 86     auto p = ll;
 87     int len = p->length;
 88     for(int j = 0; j < len; j ++ )
 89         p = p->next;
 90         cout<<"学号:"<<p->data.id<<endl;
 91         cout<<"姓名:"<<p->data.name<<endl;
 92         cout<<"成绩:"<<p->data.grade<<endl<<endl;
 93     
 94     return ok;
 95 
 96 
 97 //单链表的按值查找
 98 lnode *locatelem(linklist ll, char ee[])
 99     auto p = ll->next;
100     while(p && strcmp(p->data.name, ee) != 0)
101         p = p->next;
102     return p;
103 
104 
105 //单链表的插入
106 int listinsert(linklist &ll, int i, student ee)
107     auto p = ll;
108     int j = 1;
109     while(p->next && j < (i - 1))
110         p = p->next;
111         j ++ ;
112     
113     if(!p->next || j > (i - 1)) return error;
114     s = new lnode;
115     s->data = ee;
116     s->next = p->next;
117     p->next = s;
118     ll->length ++ ;
119     return ok;
120 
121 
122 //单链表的删除
123 int listdelete(linklist &ll, int i)
124     auto p = ll;
125     int j = 1;
126     while(p->next && j < (i - 1))
127         p = p->next;
128         j ++ ;
129     
130     if(!p->next || j > (i - 1)) return error;
131     lnode *pp = p->next;
132     p->next = pp->next;
133     delete pp;
134     ll->length -- ;
135     return ok;
136 
137 
138 //销毁链表
139 int distroylist (linklist &ll)
140     int len = ll->length;
141     for(int j = 1; j <= len; j ++ )
142         listdelete(ll, j);
143     
144     auto pp = ll->next;
145     ll->next = nullptr;
146     delete pp;
147     ll->length -- ;
148     return ok;
149 
150 
151 int main()
152 
153     SetConsoleOutputCP(65001);
154     int choose;
155     char name[80];
156     char num[80];
157 
158     cout<<"---------------"<<endl;
159     cout<<"1.初始化链表"<<endl;
160     cout<<"2.前插法构建链表"<<endl;
161     cout<<"3.后插法构建链表"<<endl;
162     cout<<"4.求链表长度"<<endl;
163     cout<<"5.显示链表内容"<<endl;
164     cout<<"6.查找学生信息"<<endl;
165     cout<<"7.获取学生信息"<<endl;
166     cout<<"8.插入学生信息"<<endl;
167     cout<<"9.删除学生信息"<<endl;
168     cout<<"10.销毁链表"<<endl;
169     cout<<"0.退出"<<endl<<endl;
170     cout<<"---------------"<<endl;
171 
172     choose = -1;
173     while(choose != 0)
174         cout<<"请选择:";
175         cin>>choose;
176         switch(choose)
177             case 1:
178                 if(initlist(l)) cout<<"成功建立单链表!"<<endl<<endl;
179                 break;
180             
181             case 2:
182                 cout<<"请输入要插入的个数:"<<endl;
183                 int x, y;
184                 cin>>x;
185                 cout<<"请输入学生的学号,姓名,成绩(空格隔开)"<<endl;
186                 int a = createlist_before(l, x);
187                 if(a) cout<<"输入student.txt 信息完毕"<<endl<<endl;
188                 break;
189             
190             case 3:
191                 cout<<"请输入要插入的个数:"<<endl;
192                 int x, y;
193                 cin>>x;
194                 cout<<"请输入学生的学号,姓名,成绩(空格隔开)"<<endl;
195                 int a = createlist_after(l, x);
196                 if(a) cout<<"输入student.txt 信息完毕"<<endl<<endl;
197                 break;
198             
199             case 4:
200                 cout<<"长度为:"<<l->length<<endl<<endl;
201                 break;
202             
203             case 5:
204                 int a = listdisplay(l);
205                 cout<<"显示完毕"<<endl<<endl;
206                 break;
207             
208             case 6:
209                 cout<<"请输入一个位置用来取值:";
210                 int i;
211                 cin>>i;
212                 if(getelem(l, i))
213                     cout<<"查找成功\n";
214                     cout<<"学号:"<<ss.id<<endl;
215                     cout<<"姓名:"<<ss.name<<endl;
216                     cout<<"成绩:"<<ss.grade<<endl<<endl;
217                 
218                 else cout<<"查找失败"<<endl<<endl;
219                 break;
220             
221             case 7:
222                 cout<<"请输入所要查找学生姓名:";
223                 cin>>name;
224                 auto p = locatelem(l, name);
225                 if(p != nullptr)
226                     cout<<"查找成功"<<endl;
227                     cout<<"对应的学生信息为:"<<endl;
228                     cout<<"学号:"<<p->data.id<<endl;
229                     cout<<"姓名:"<<p->data.name<<endl;
230                     cout<<"成绩:"<<p->data.grade<<endl<<endl;
231                 
232                 else cout<<"查无此人"<<endl<<endl;
233                 break;
234             
235             case 8:
236                 cout<<"请输入插入的位置和学生的学号姓名成绩(用空格隔开):"<<endl;
237                 int i;
238                // char str[2];
239                 cin>>i;
240                 //scanf("%c", &str);
241                 cin>>e.id>>e.name>>e.grade;
242                 if(listinsert(l, i, e))
243                     cout<<"插入成功"<<endl<<endl;
244                 else cout<<"插入失败"<<endl<<endl;
245                 break;
246             
247             case 9:
248                 cout<<"请输入要删除的学生的编号:";
249                 int i;
250                 cin>>i;
251                 if(listdelete(l, i)) cout<<"删除成功"<<endl<<endl;
252                 else cout<<"删除失败"<<endl<<endl;
253                 break;
254             
255             case 10:
256                 if(distroylist(l)) cout<<"成功销毁链表!"<<endl<<endl;
257                 break;
258             
259         
260     
261     return 0;
262 

总结:写下一个实验注意变量的定义(自己都不记得用过没有了)

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

[PTA]实验11-2-3 逆序数据建立链表

2116=数据结构实验之链表一:顺序建立链表

2054=数据结构实验之链表九:双向链表

数据结构实验报告-实验一 顺序表单链表基本操作的实现

《程序设计基础》实验题目2 c文件读取(反序列化?) 链表排序

3331=数据结构实验之链表八:Farey序列