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