通过使用指针进一步熟悉链表操作实现添加删除修改查找排序等功能.docx
- 文档编号:11131784
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:38
- 大小:126.69KB
通过使用指针进一步熟悉链表操作实现添加删除修改查找排序等功能.docx
《通过使用指针进一步熟悉链表操作实现添加删除修改查找排序等功能.docx》由会员分享,可在线阅读,更多相关《通过使用指针进一步熟悉链表操作实现添加删除修改查找排序等功能.docx(38页珍藏版)》请在冰豆网上搜索。
通过使用指针进一步熟悉链表操作实现添加删除修改查找排序等功能
学院:
信息工程学院2012年3月13日
专业:
计算机科学与技术
学号:
*******
姓名:
*****
C++实验报告
(一)
实验课题描述:
通过使用指针,进一步熟悉链表操作,实现添加,删除,修改,查找,排序等功能。
我的课题理解:
我把课题定位在学生信息管理系统:
创建一个带头结点学生链表,用菜单的形式实现增删改查功能外,用采用冒泡排序实现按学生成绩由高到低排序功能,同时又实现用户登陆,用户注册验证,以及一屏连续向用户展示功能。
目录:
程序代码实现部分:
p1----p14
实验结果部分:
P15---P20
实验中遇到问题及解决方法:
P21---P25
实验心得:
P26
#include
#include
//存储学生信息
structstu
{
charid[10];
char*name;
doublegrade;
stu*next;
};
typedefstustulst;
//函数声明
//显示所有学生信息
voidShowLst(stulst*lst);
//main()函数中对插入命令做的提示操作代码
voidInsert(stulst*lst);
//再插入过程中会调用此函数,为的是让InsertLst()专心做插入操作
stu*CreateNode(char*id,char*name,doublegrade);
//专心做插入操作
voidInsertLst(stulst*lst,char*id,char*name,doublegrade,charL);
//修改学生信息
voidUpdate(stulst*lst);
voidUpDateByGrade(stulst*lst,char*id,doublegrade);
//按成绩从高到低排序对学生进行排序
voidSortLstByGrade(stulst*lst);
//删除学生信息
voidDelete(stulst*lst);
voidDeleteAll(stulst*lst);
voidDeleteByID(stulst*lst,char*id);
//simple登陆验证和注册用户功能
intUsertestAdd();
//存储用户结构体数组
structteach
{
charid[10];
charname[10];
charpassword[10];
};
voidmain()
{//simple登陆验证和注册用户功能
if(!
UsertestAdd())
return;
cout<<"------请按下列提示操作--------"< cout<<"输入数字1表示开始工作;0表示退出系统"< cout<<"*******************************************"< stulstlst; lst.next=NULL; intbegin=0; cin>>begin; while(begin==1) {cout<<"*********请选择操作类型***********"< cout< cout<<"(输入不同数字代表不同功能)"< cout<<"----------1表示添加学生信息--------"< cout<<"----------2代表删除学生信息--------"< cout<<"----------3按成绩高低来排序--------"< cout<<"----------4代表修改学生成绩--------"< cout<<"----------5显示所有学生信息--------"< cout< inttip=0; cin>>tip; if(tip<0||tip>5) {cout<<"您的操作非法! ! ! "< continue; } switch(tip) {case1: Insert(&lst); break; case2: Delete(&lst); break; case3: SortLstByGrade(&lst); break; case4: Update(&lst); break; case5: ShowLst(&lst); break; } if(tip! =5)ShowLst(&lst); cout< "< cin>>begin; } } intUsertestAdd() { //simple登陆验证和注册用户功能 teachUserArr[10]={"201117930","姚应哲","201117930"};//默认用户 intcount=0;//统计输入用户名和密码错误次数 inti=0;//遍历变量或找到用户的ID intk=1;//表示已存在的用户数 while (1) { intn=0;//标识是否匹配,若匹配,则退出外循环 cout<<"请输入您的管理账号"< charid[10]; cin>>id; cout<<"请输入密码"< charpassword[10]; cin>>password; for(i=0;i<10;i++) { if(! strcmp(UserArr[i].id,id)&&! strcmp(UserArr[i].password,password)) { n=1; break; } } if(n) { break; } i=0; count++; cout<<"密码或账号错误,"; if(count==2||k==2) { cout<<"您今天已累计输错"< cout<<"您是否要注册用户? (否则您将自动退出系统)"< cout< cout<<"输入数字1表示同意注册,其他则表示不同意条款"< inttip=0; cin>>tip; if(tip==1) { if(k==2) { cout<<"很遗憾,系统用户总数达到上限,无法注册,若需注册,请联系管理员"< return0; } else{ cout<<"请输入要注册账号"< charid[10]; cin>>id; strcpy(UserArr[k+1].id,id); cout<<"请输入您的姓名"< charname[10]; cin>>name; strcpy(UserArr[k+1].name,name); cout<<"请输入您的密码"< charpassword[10]; cin>>password; strcpy(UserArr[k+1].password,password); cout<<"注册成功,系统正在为您跳转到登陆界面"< intj=0; while(j<1000000000){j++;} cout< ++k; } }elsereturn0; } } cout< cout<<"*******************************************"< cout<<"欢迎进"< cout<<"*******************************************"< cout< return1; } voidSortLstByGrade(stulst*lst) { if(! lst||! (lst->next))//链表不存在或者为空链表则直接退出 return; stu*p=lst->next;//p指向第1个节点 if(! p->next)//若只有一个节点则不用排序了,直接输出 return; stu*q=p->next;//q指向第2个节点 stu*T=lst;//T每次都指向已排序的最后一个节点 while(p) { //由p指向每次遍历得到的最大值 while(q) { if(q->grade>p->grade) { p=q; if(! q->next) break; q=q->next; } else { if(! q->next) break; q=q->next; } } //cout<<"success"< //上面的排序函数部分已经找到最大节点,已经判断是否每次开始遍历的那个节点是最大的若是则不必查找p的前一个节点, //以便于将其连接到以排序节点的尾部 stu*pre=T->next; if(p==pre) { T=T->next; } else { while(pre) { if(strcmp(pre->next->id,p->id)==0) { pre->next=p->next; ///此行代码出错,原因是在找到最大值节点p后,将p连接到以排序节点尾部时出错,应该是p->next=T->next;而不是p=T->next; //p=T->next; p->next=T->next; T->next=p; T=p; break; } pre=pre->next; } } if(! T->next) return; p=T->next; if(! p->next) return; q=p->next; } } voidDelete(stulst*lst) { cout<<"请选择删除方式"< cout<<"(输入数字1表示删除指定学好的学生信息,其他数字表示删除所有学生信息)"< intn=0; cin>>n; if(n==1) { cout<<"请输入要删除学生的学号"< charid[10]; cin>>id; DeleteByID(lst,id); } else { DeleteAll(lst); return; } } voidDeleteAll(stulst*lst) { if(! lst) return; stu*p=lst; while(p->next) { stu*q=p->next; p->next=q->next; if(q->name) delete[]q->name; deleteq; } } voidDeleteByID(stulst*lst,char*id) { if(! lst||! id) return; stu*p=lst; intn=1; while(p->next) { if(strcmp(p->next->id,id)==0) { n=0; stu*q=p->next; p->next=q->next; if(q->name) delete[]q->name; deleteq; break; } p=p->next; } if(n) { cout<<"您要删除的学生不存在"< } } voidUpdate(stulst*lst) { cout<<"请输入要修改成绩学生ID"< charid[10]; cin>>id; cout<<"请输入修改后的成绩"< doublegrade; cin>>grade; UpDateByGrade(lst,id,grade); } voidUpDateByGrade(stulst*lst,char*id,doublegrade) { if(! lst||! lst->next) return; stu*p=lst->next; intexsists=1; while(p) { if(strcmp(p->id,id)==0) { exsists=0; p->grade=grade; break; } p=p->next; } if(exsists) { cout<<"输入有误,该学生信息不存在! "< } } voidShowLst(stulst*lst) { if(! lst) return; stu*p=lst->next; cout.setf(ios: : left); cout.width(10); cout<<"学号"; cout.width(16); cout<<"姓名"; cout.width(4); cout<<"分数"< cout<<"************************************"< while(p) { cout.width(10); cout< cout.width(16); cout< cout.width(4); cout< p=p->next; } } //函数Insert(); voidInsert(stulst*lst) { cout<<"请输入添加学生信息的位置"< cout<<"----输入F首行显示----"< //cout<<"输入M中间(以第二行为例)显示"< cout<<"----输入M指定学生学号的前面显示(若不存在则首行插入)----"< cout<<"----输入L尾行显示----"< charlocation; while (1) {cin>>location; if(location=='F'||location=='M'||location=='L') { break; } else cout<<"工作时间,不许瞌睡,请选择要插入的位置"< } //中间插入不能使用默认值 intn=0; if(location! ='M') { cout<<"是否手动输入学生信息(输入数字1),还是使用默认值插入(输入0)"< cin>>n; } else{n=1;} if(n! =1) { InsertLst(lst,"1002","2号",78.8,location); InsertLst(lst,"1003","2号",88.8,location); InsertLst(lst,"1004","3号",88.5,location); InsertLst(lst,"1001","1号",88.8,location); InsertLst(lst,"1006","5号",98.8,location); InsertLst(lst,"1007","6号",78.8,location); InsertLst(lst,"1005","4号",58.8,location); InsertLst(lst,"1010","10号",90.5,location); InsertLst(lst,"1008","7号",48.8,location); InsertLst(lst,"1009","8号",58.5,location); } else { charid[10]; charname[20]; floatgrade; cout<<"请输入学号"< cin>>id; cout<<"请输入姓名"< cin>>name; cout<<"请输入分数"< cin>>grade; InsertLst(lst,id,name,grade,location); cout< } } //函数 stu*CreateNode(char*id,char*name,doublegrade) { stu*p=newstu; p->grade=grade; strcpy(p->id,id); if(name) { //动态分配存储空间时出错,newchar[length],而不是newchar(length),所以在删除时报错 //p->name=newchar(strlen(name)+1); p->name=newchar[strlen(name)+1]; strcpy(p->name,name); } else p->name=NULL; returnp; } voidInsertLst(stulst*lst,char*id,char*name,doublegrade,charL) { if(! lst||! id) return; stu*t=lst->next; while(t) { if(strcmp(t->id,id)==0) { cout< cout<<"插入异常(该生已存在)"< return; } t=t->next; } stu*Node=CreateNode(id,name,grade); switch(L) { case'F': if(! lst->next) { lst->next=Node; Node->next=NULL; } else { Node->next=lst->next; lst->next=Node; } break; case'M': //在指定学生之前插入一条学生信息 while (1) { charid1[10]; cout<<"请输入A的学号(要在某学生A之前插入这条学生信息)"< cin>>id1; stu*pt=lst; stu*q=pt->next; //如基准不存在则首航插入 if(! lst->next) { lst->next=Node; Node->next=NULL; return; } if(strcmp(q->id,id1)==0) { Node->next=q->next; lst->next=q; return; } //while(strcmp(q->id,id1)&&q) while(q&&strcmp(q->id,id1)) { pt=q; q=q->next; } if(! q) { cout<<"你选择的插入基准不存在"< cout< continue; } else { Node->next=pt->next; pt->next=Node; return; } } break; case'L': stu*pre=lst; stu*p=pre->next; while(p) { pre=p; p=p->next; } pre->next=Node; Node->next=NULL; break; } } 试验结果: 试验结果如下(全部实验结果用一个屏幕), 故没有向上面一样截取图片: 请输入您的管理账号 201117930 请输入密码 201117930 ******************************************* 欢迎进姚应哲入学生管理系统 ******************************************* ------请按下列提示操作-------- 输入数字1表示开始工作;0表示退出系统 ******************************************* 1 *********请选择操作类型*********** (输入不同数字代表不同功能) ----------1表示添加学生信息--------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通过 使用 指针 进一步 熟悉 操作 实现 添加 删除 修改 查找 排序 功能