一个指针构建的动态链表
一:学生信息的录入
二:学生信息的打印
三:学生信息的增加
四:学生信息的查询
五:学生信息的修改及复位
六:学生信息的删减
#include<iostream>
#include<string>
#define NULL 0
#define STU struct student
using namespace std;
STU
{
int num;
float score;
char name[20];
char sex[5];
STU *next;
};
void main()
{
STU * log(STU * head1,int &G);
void print(STU *head1);
void cor(STU *head1);
void fou(STU *head1);
void add(STU *head1);
void del(STU *head1);
STU *head1;
int m,g=0;
cout<<"_________________________菜单栏______________________________"<<endl;
cout<<" 1、学生信息的录入 "<<endl;
cout<<" 2、学生信息的增加 "<<endl;
cout<<" 3、学生信息的删除 "<<endl;
cout<<" 4、学生信息的查询 "<<endl;
cout<<" 5、学生信息的修改 "<<endl;
cout<<" 6、学生信息的打印 "<<endl;
cout<<" 0、退出系统 "<<endl;
cout<<"_____________________________________________________________"<<endl;
while(m)
{
cout<<" 请选择菜单栏";
cin>>m;
if(m>1)
{
if(g==0)
{
cout<<"对不起,您还没有将学生信息录入,目前还不能执行1之后的操作!!!"<<endl; //固定操作步骤
break; //若直接执行操作1之后的选项,报错退出
}
}
switch(m)
{
case 1:head1=log(head1,g);break;
case 2:add(head1);break;
case 3:del(head1);break;
case 4:fou(head1);break;
case 5:cor(head1);break;
case 6:print(head1);break;
}
}
}
STU * log(STU * head1,int &G)
{
G++;
STU *p;
int m=0;
head1=NULL;
p=new student;
cout<<"请录入第1个学生的信息:"<<endl;
cin>>(*p).num>>(*p).name>>p->sex>>p->score;
while((*p).num!=0)
{
m++;
if(m==1)
{
head1=p;
(*p).next=p;
}
else
{
(*p).next=new student;
cout<<"请录入第"<<m<<"个学生的信息:"<<endl;
cin>>(*(*p).next).num>>(*(*p).next).name>>(*(*p).next).sex>>(*(*p).next).score;
p=(*p).next;
}
}
(*p).next=NULL;
return(head1);
}
void print(STU *head1)
{
STU *p;
p=head1;
while(p->num!=0)
{
cout<<(*p).num<<"\t"<<(*p).name<<"\t"<<p->sex<<"\t"<<p->score<<endl;
p=(*p).next;
}
}
void cor(STU *head1)
{
void print(STU *head1);
int m;
STU *p,*p0,*p1;
p=head1;
p0=new student;
p1=new student;
cout<<"请输入您要修改的学生信息:"<<endl;
cin>>(*p0).num>>(*p0).name>>p0->sex>>p0->score;
while((*p).num!=(*p0).num&&p!=NULL)
{
p=(*p).next;
}
if((*p).num!=(*p0).num)
{
cout<<"抱歉!此链表中不存在该生!!!"<<endl;//有点小问题
}
else
{
cout<<"请输入修改后的学生信息:"<<endl;
cin>>(*p).num>>(*p).name>>p->sex>>p->score;
(*p1).num=(*p).num;
strcpy((*p1).name,(*p).name);
strcpy((*p1).sex,(*p).sex);
(*p1).score=(*p).score;
while(m!=3)
{
cout<<"是否要复位?1、不复位 2、复位 3、退出:"<<endl;
cin>>m;
if(m==1)
{
(*p).num=(*p1).num;
strcpy((*p).name,(*p1).name);
strcpy((*p).sex,(*p1).sex);
(*p).score=(*p1).score;
print(head1);
}
if(m==2)
{
(*p).num=(*p0).num;
strcpy((*p).name,(*p0).name);
strcpy((*p).sex,(*p0).sex);
(*p).score=(*p0).score;
print(head1);
}
}
}
}
void fou(STU *head1)
{
void num(STU *head1);
void name(STU *head1);
int m;
while(m!=3)
{
cout<<" "<<"请选择查询方式:"<<endl;
cout<<" "<<"1、通过学号查询"<<endl;
cout<<" "<<"2、通过姓名查询"<<endl;
cout<<" "<<"3、退出查询系统"<<endl;
cin>>m;
switch(m)
{
case 1:num(head1);break;
case 2:name(head1);break;
}
}
}
void num(STU *head1)
{
int num1;
STU *p;
p=head1;
cout<<"请输入被查询学生的学号:"<<endl;
cin>>num1;
while((*p).num!=num1)
{
p=(*p).next;
}
if((*p).num==num1)
{
cout<<(*p).num<<"\t"<<(*p).name<<"\t"<<p->sex<<"\t"<<p->score<<endl;
}
}
void name(STU *head1)
{
char name1[10];
STU *p;
p=head1;
cout<<"请输入被查询学生的姓名:"<<endl;
cin>>name1;
while(strcmp((*p).name,name1)!=0)
{
p=(*p).next;
}
if(strcmp((*p).name,name1)==0)
{
cout<<(*p).num<<"\t"<<(*p).name<<"\t"<<p->sex<<"\t"<<p->score<<endl;
}
}
void add(STU *head1)
{
void print(STU *head1);
STU *p,*p1;
p=head1;
p1=new student;
cout<<"请输入新增学生的学生信息:"<<endl;
cin>>(*p1).num>>(*p1).name>>p1->sex>>p1->score;
if((*p1).num<p->num) //若执行此步,执行完此步后直接打印并跳出循环//
{
(*p1).next=head1;
head1=p1;
print(head1);
}
while(p1->num>p->next->num&&p->next->num!=0) //若执行此步,第一个if肯定未执行//
{
p=p->next; //p结点向后移//
}
if(p->next->num>p1->num) //此句表示p1遇到了自己该在的位置,插入//
{
p1->next=p->next;
p->next=p1;
print(head1); //打印
}
else //此句表示p1应该是最后一个结点//
{
(*p1).next=p->next;
(*p).next=p1;
print(head1); //打印
}
}
void del(STU *head1)
{
void print(STU *head1);
STU *p,*p0;
p0=new student;
p=head1;
int m;
cout<<"请选择:"<<endl;
cout<<"1、通过学号删除"<<endl;
cout<<"2、通过姓名删除"<<endl;
cin>>m;
if(m==1)
{
cout<<"请输入要删除的学号:"<<endl;
cin>>p0->num;
if(p->num==p0->num)
{
head1=p->next;
print(head1);
}
while(p->next->num!=p0->num&&p->next!=NULL)
{
p=p->next;
}
if(p->next->num==p0->num&&p->next!=NULL)
{
p->next=p->next->next;
print(head1);
}
else
{
p->next=NULL;
print(head1);
}
}
if(m==2)
{
cout<<"请输入要删除的学生姓名:"<<endl;
cin>>p0->name;
if(strcmp(p0->name,p->name)==0)
{
head1=p->next;
print(head1);
}
while(strcmp(p->next->name,p0->name)!=0&&p->next!=NULL)
{
p=p->next;
}
if(strcmp(p->next->name,p0->name)==0&&p->next!=NULL)
{
p->next=p->next->next;
print(head1);
}
else
{
p->next=NULL;
print(head1);
}
}
delete p0;
}