数据结构实验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 }

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

posted @ 2019-09-25 11:31  moomight  阅读(549)  评论(0编辑  收藏  举报