通过使用指针,进一步熟悉链表操作,实现添加,删除,修改,查找,排序等功能。
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
if(!lst ||!lst->next )
return;
stu *p=lst->next ;
int exsists=1;
while(p)
{
if(strcmp(p->id ,id)==0)
{
exsists=0;
p->grade =grade;
break;
}
p=p->next ;
}
if(exsists)
{
int n=0;//标识是否匹配,若匹配,则退出外循环
cout<<"请输入您的管理账号"<<endl;
char id[10];
cin>>id;
cout<<"请输入密码"<<endl;
char password[10];
cin>>password;
for(i=0;i<10;i++)
{
if(!strcmp(UserArr[i].id,id)&&!strcmp(UserArr[i].password,password))
stulst lst;
lst.next =NULL;
int begin=0;
cin>>begin;
while(begin==1)
{cout<<"*********请选择操作类型***********"<<endl;
cout<<endl;
cout<<"(输入不同数字代表不同功能)"<<endl;
cout<<"----------1表示添加学生信息--------"<<endl;
{
cout<<"请选择删除方式"<<endl;
cout<<"(输入数字1表示删除指定学好的学生信息,其他数字表示删除所有学生信息)"<<endl;
int n=0;
cin>>n;
if(n==1)
{
cout<<"请输入要删除学生的学号"<<endl;
char id[10];
cin>>id;
DeleteByID(lst,id);
char id[10];
cin>>id;
cout<<"请输入修改后的成绩"<<endl;
double grade;
cin>>grade;
UpDateByGrade(lst,id,grade);
}
void UpDateByGrade(stulst* lst,char* id,double grade)
delete q;
}
}
void DeleteByID(stulst* lst,char* id)
{
if(!lst||!id)
return;
stu* p=lst;
int n=1;
while(p->next )
{
if(strcmp(p->next->id,id)==0)
{
n=0;
stu* q=p->next ;
void UpDateByGrade(stulst* lst,char* id,double grade);
//按成绩从高到低排序对学生进行排序
void SortLstByGrade(stulst* lst);
//删除学生信息
void Delete(stulst *lst);
void DeleteAll(stulst* lst);
目录:
程序代码实现部分:p1----p14
实验结果部分:P15---P20
实验中遇到问题及解决方法:P21---P25
实验心得:P26
#include<iostream.h>
#include<string.h>
//存储学生信息
struct stu
{
char id[10];
char *name;
double grade;
cout<<endl;
return 1;
}
void SortLstByGrade(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 ;
cout<<"姓名";
cout.width (4);
cout<<"分数"<<endl;
cout<<"************************************"<<endl;
cout<<endl;
int tip=0;
cin>>tip;
if(tip<0||tip>5)
{cout<<"您的操作非法!!!"<<endl;
continue;
}
switch(tip)
{case 1:Insert(&lst);
break;
case 2: Delete(&lst);
break;
case 3: SortLstByGrade(&lst);
void DeleteByID(stulst* lst,char* id);
//simple登陆验证和注册用户功能
int UsertestAdd();
//存储用户结构体数组
struct teach
{
char id[10];
char name[10];
char password[10];
};
void main()
cout<<"----------2代表删除学生信息--------"<<endl;
cout<<"----------3按成绩高低来排序--------"<<endl;
cout<<"----------4代表修改学生成绩--------"<<endl;
cout<<"----------5显示所有学生信息--------"<<endl;
char id[10];
cin>>id;
strcpy(UserArr[k+1].id ,id);
cout<<"请输入您的姓名"<<endl;
char name[10];
cin>>name;
strcpy(UserArr[k+1].name ,name);
cout<<"请输入您的密码"<<endl;
char password[10];
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 ;
}Leabharlann Baidu
else
{
if(!q->next )
break;
q=q->next ;
}
}
//cout<<"success"<<p->grade<<endl;//以前为测试语句
//上面的排序函数部分已经找到最大节点,已经判断是否每次开始遍历的那个节点是最大的若是则不必查找p的前一个节点,
//以便于将其连接到以排序节点的尾部
{//simple登陆验证和注册用户功能
if(!UsertestAdd())
return;
cout<<"------请按下列提示操作--------"<<endl;
cout<<"输入数字1表示开始工作;0表示退出系统"<<endl;
cout<<"*******************************************"<<endl;
{
cout<<"输入有误,该学生信息不存在!"<<endl;
}
}
void ShowLst(stulst *lst)
{
if(!lst)
return;
stu *p=lst->next ;
cout.setf (ios::left);
cout.width (10);
cout<<"学号";
cout.width (16);
p->next =q->next ;
if(q->name)
delete[] q->name ;
delete q;
break;
}
p=p->next ;
}
if(n)
{
cout<<"您要删除的学生不存在"<<endl;
}
}
void Update(stulst *lst)
{
cout<<"请输入要修改成绩学生ID"<<endl;
stu *CreateNode(char *id,char *name,double grade);
//专心做插入操作
void InsertLst(stulst* lst,char *id,char *name,double grade,char L);
//修改学生信息
void Update(stulst *lst);
}
}
cout<<endl;
cout<<"*******************************************"<<endl;
cout<<"欢迎进"<<UserArr[i].name <<"入学生管理系统"<<endl;
cout<<"*******************************************"<<endl;
//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 ;
}
}
void Delete(stulst *lst)
cin>>password;
strcpy(UserArr[k+1].password ,password);
cout<<"注册成功,系统正在为您跳转到登陆界面"<<endl;
int j=0;
while(j<1000000000){j++;}
cout<<endl;
++k;
}
}else return 0;
}
else
{
DeleteAll(lst);
return;
}
}
void DeleteAll(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 ;
cout<<"输入数字1表示同意注册,其他则表示不同意条款"<<endl;
int tip=0;
cin>>tip;
if(tip==1)
{
if(k==2)
{
cout<<"很遗憾,系统用户总数达到上限,无法注册,若需注册,请联系管理员"<<endl;
return 0;
}
else{
cout<<"请输入要注册账号"<<endl;
{
n=1;
break;
}
}
if(n)
{
break;
}
i=0;
count++;
cout<<"密码或账号错误,";
if(count==2||k==2)
{
cout<<"您今天已累计输错"<<count<<"次-";
cout<<"您是否要注册用户?(否则您将自动退出系统)"<<endl;
cout<<endl;
学院:信息工程学院2012年3月13日
专业:计算机科学与技术
学号:*******
姓名:*****
实验课题描述:
通过使用指针,进一步熟悉链表操作,实现添加,删除,修改,查找,排序等功能。
我的课题理解:
我把课题定位在学生信息管理系统:创建一个带头结点学生链表,用菜单的形式实现增删改查功能外,用采用冒泡排序实现按学生成绩由高到低排序功能,同时又实现用户登陆,用户注册验证,以及一屏连续向用户展示功能。
break;
case 4: Update(&lst);
break;
case 5: ShowLst(&lst);
break;
}
if(tip!=5)ShowLst(&lst);
cout<<endl;cout<<"您是否要继续工作(输入1继续,其他退出)?"<<endl;
cin>>begin;
}
}
int UsertestAdd()
stu* next;
};
typedef stu stulst;
//函数声明
//显示所有学生信息
void ShowLst(stulst *lst);
//main()函数中对插入命令做的提示操作代码
void Insert(stulst *lst);
//再插入过程中会调用此函数,为的是让InsertLst()专心做插入操作
{
//simple登陆验证和注册用户功能
teach UserArr[10]={"201117930","姚应哲","201117930"};//默认用户
int count=0;//统计输入用户名和密码错误次数
int i=0;//遍历变量或找到用户的ID
int k=1;//表示已存在的用户数
while(1)
if(!lst ||!lst->next )
return;
stu *p=lst->next ;
int exsists=1;
while(p)
{
if(strcmp(p->id ,id)==0)
{
exsists=0;
p->grade =grade;
break;
}
p=p->next ;
}
if(exsists)
{
int n=0;//标识是否匹配,若匹配,则退出外循环
cout<<"请输入您的管理账号"<<endl;
char id[10];
cin>>id;
cout<<"请输入密码"<<endl;
char password[10];
cin>>password;
for(i=0;i<10;i++)
{
if(!strcmp(UserArr[i].id,id)&&!strcmp(UserArr[i].password,password))
stulst lst;
lst.next =NULL;
int begin=0;
cin>>begin;
while(begin==1)
{cout<<"*********请选择操作类型***********"<<endl;
cout<<endl;
cout<<"(输入不同数字代表不同功能)"<<endl;
cout<<"----------1表示添加学生信息--------"<<endl;
{
cout<<"请选择删除方式"<<endl;
cout<<"(输入数字1表示删除指定学好的学生信息,其他数字表示删除所有学生信息)"<<endl;
int n=0;
cin>>n;
if(n==1)
{
cout<<"请输入要删除学生的学号"<<endl;
char id[10];
cin>>id;
DeleteByID(lst,id);
char id[10];
cin>>id;
cout<<"请输入修改后的成绩"<<endl;
double grade;
cin>>grade;
UpDateByGrade(lst,id,grade);
}
void UpDateByGrade(stulst* lst,char* id,double grade)
delete q;
}
}
void DeleteByID(stulst* lst,char* id)
{
if(!lst||!id)
return;
stu* p=lst;
int n=1;
while(p->next )
{
if(strcmp(p->next->id,id)==0)
{
n=0;
stu* q=p->next ;
void UpDateByGrade(stulst* lst,char* id,double grade);
//按成绩从高到低排序对学生进行排序
void SortLstByGrade(stulst* lst);
//删除学生信息
void Delete(stulst *lst);
void DeleteAll(stulst* lst);
目录:
程序代码实现部分:p1----p14
实验结果部分:P15---P20
实验中遇到问题及解决方法:P21---P25
实验心得:P26
#include<iostream.h>
#include<string.h>
//存储学生信息
struct stu
{
char id[10];
char *name;
double grade;
cout<<endl;
return 1;
}
void SortLstByGrade(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 ;
cout<<"姓名";
cout.width (4);
cout<<"分数"<<endl;
cout<<"************************************"<<endl;
cout<<endl;
int tip=0;
cin>>tip;
if(tip<0||tip>5)
{cout<<"您的操作非法!!!"<<endl;
continue;
}
switch(tip)
{case 1:Insert(&lst);
break;
case 2: Delete(&lst);
break;
case 3: SortLstByGrade(&lst);
void DeleteByID(stulst* lst,char* id);
//simple登陆验证和注册用户功能
int UsertestAdd();
//存储用户结构体数组
struct teach
{
char id[10];
char name[10];
char password[10];
};
void main()
cout<<"----------2代表删除学生信息--------"<<endl;
cout<<"----------3按成绩高低来排序--------"<<endl;
cout<<"----------4代表修改学生成绩--------"<<endl;
cout<<"----------5显示所有学生信息--------"<<endl;
char id[10];
cin>>id;
strcpy(UserArr[k+1].id ,id);
cout<<"请输入您的姓名"<<endl;
char name[10];
cin>>name;
strcpy(UserArr[k+1].name ,name);
cout<<"请输入您的密码"<<endl;
char password[10];
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 ;
}Leabharlann Baidu
else
{
if(!q->next )
break;
q=q->next ;
}
}
//cout<<"success"<<p->grade<<endl;//以前为测试语句
//上面的排序函数部分已经找到最大节点,已经判断是否每次开始遍历的那个节点是最大的若是则不必查找p的前一个节点,
//以便于将其连接到以排序节点的尾部
{//simple登陆验证和注册用户功能
if(!UsertestAdd())
return;
cout<<"------请按下列提示操作--------"<<endl;
cout<<"输入数字1表示开始工作;0表示退出系统"<<endl;
cout<<"*******************************************"<<endl;
{
cout<<"输入有误,该学生信息不存在!"<<endl;
}
}
void ShowLst(stulst *lst)
{
if(!lst)
return;
stu *p=lst->next ;
cout.setf (ios::left);
cout.width (10);
cout<<"学号";
cout.width (16);
p->next =q->next ;
if(q->name)
delete[] q->name ;
delete q;
break;
}
p=p->next ;
}
if(n)
{
cout<<"您要删除的学生不存在"<<endl;
}
}
void Update(stulst *lst)
{
cout<<"请输入要修改成绩学生ID"<<endl;
stu *CreateNode(char *id,char *name,double grade);
//专心做插入操作
void InsertLst(stulst* lst,char *id,char *name,double grade,char L);
//修改学生信息
void Update(stulst *lst);
}
}
cout<<endl;
cout<<"*******************************************"<<endl;
cout<<"欢迎进"<<UserArr[i].name <<"入学生管理系统"<<endl;
cout<<"*******************************************"<<endl;
//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 ;
}
}
void Delete(stulst *lst)
cin>>password;
strcpy(UserArr[k+1].password ,password);
cout<<"注册成功,系统正在为您跳转到登陆界面"<<endl;
int j=0;
while(j<1000000000){j++;}
cout<<endl;
++k;
}
}else return 0;
}
else
{
DeleteAll(lst);
return;
}
}
void DeleteAll(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 ;
cout<<"输入数字1表示同意注册,其他则表示不同意条款"<<endl;
int tip=0;
cin>>tip;
if(tip==1)
{
if(k==2)
{
cout<<"很遗憾,系统用户总数达到上限,无法注册,若需注册,请联系管理员"<<endl;
return 0;
}
else{
cout<<"请输入要注册账号"<<endl;
{
n=1;
break;
}
}
if(n)
{
break;
}
i=0;
count++;
cout<<"密码或账号错误,";
if(count==2||k==2)
{
cout<<"您今天已累计输错"<<count<<"次-";
cout<<"您是否要注册用户?(否则您将自动退出系统)"<<endl;
cout<<endl;
学院:信息工程学院2012年3月13日
专业:计算机科学与技术
学号:*******
姓名:*****
实验课题描述:
通过使用指针,进一步熟悉链表操作,实现添加,删除,修改,查找,排序等功能。
我的课题理解:
我把课题定位在学生信息管理系统:创建一个带头结点学生链表,用菜单的形式实现增删改查功能外,用采用冒泡排序实现按学生成绩由高到低排序功能,同时又实现用户登陆,用户注册验证,以及一屏连续向用户展示功能。
break;
case 4: Update(&lst);
break;
case 5: ShowLst(&lst);
break;
}
if(tip!=5)ShowLst(&lst);
cout<<endl;cout<<"您是否要继续工作(输入1继续,其他退出)?"<<endl;
cin>>begin;
}
}
int UsertestAdd()
stu* next;
};
typedef stu stulst;
//函数声明
//显示所有学生信息
void ShowLst(stulst *lst);
//main()函数中对插入命令做的提示操作代码
void Insert(stulst *lst);
//再插入过程中会调用此函数,为的是让InsertLst()专心做插入操作
{
//simple登陆验证和注册用户功能
teach UserArr[10]={"201117930","姚应哲","201117930"};//默认用户
int count=0;//统计输入用户名和密码错误次数
int i=0;//遍历变量或找到用户的ID
int k=1;//表示已存在的用户数
while(1)