实验要求
- 对学生的基本信息用链表进行处理,基本信息包括:学号、姓名、性别、 年龄、C 语言的成绩。
- 要求:
(1)建立链表,输入一个学生的基本信息,插入链表,插入要求为链表必 须按照学号从小到大的顺序进行排列。
(2)可以在链表中删除某一学生的信息即输入一个学生的学号,查找到该 节点信息作删除。
(3)用函数封装每一个操作。
首先,定义一个结构体:
struct xxx
{
long long xh;//学号,不考虑存在非数字,还有我知道最大位数,别杠
char xm[10],xb;//定义姓名,性别,这里只考虑最高4个中文字符作为姓名,性别用M来代表男,W来代表女,O来代表其他QAQ;
int age,cyy;//年龄和c语言成绩
struct xxx *next;//指向下一个
struct xxx *last;//指向上一个
};
然后考虑到要求(3)
我们定义了
一个菜单
输入函数
删除函数
输出函数
退出函数
嗯,还有主函数
void menu();
void sr();
void sc();
void bs();
void exit();
先来看一下主函数
int main()
{
int op;
t=NULL;
w=NULL;
while(f){
system("cls");//清空
menu();
bs();//输出函数
cin>>op;
switch(op)
{
case 1:
cout<<"依次输入学号、姓名、性别、 年龄、C 语言的成绩"<<endl;
sr();
break;
case 2:
sc();
break;
case 3:
exit();
break;
}
system("pause");//暂停
}
return 0;
}
菜单在这里
void menu()
{//嗯,就是一串文字,增加交互能力
cout<<"1:输入一个学生的基本信息"<<endl<<"2:输入一个学生的学号删除该学生的信息"<<endl<<"3:退出"<<endl;
cout<<"如果要退出,请按3和回车键,不要点X!!!!!!!!!!!!!"<<endl;
//链表采用动态分配,直接退出可能会存在安全隐患
}
输入函数
void sr()
{//确实有点长,但是主要是为了增加交互性,而且这里用的是双向链表,虽然有点多余
struct xxx *p,*q;
p=(struct xxx *)malloc(sizeof(struct xxx));
cout<<"输入学号"<<endl;
cin>>(p->xh);
cout<<"输入姓名"<<endl;
cin>>(p->xm);
cout<<"输入性别"<<endl;
cin>>(p->xb);
cout<<"输入年龄"<<endl;
cin>>(p->age);
cout<<"输入c语言成绩"<<endl;
cin>>(p->cyy);
if(t==NULL){
t=p;
w=p;
p->next=NULL;
p->last=NULL;
}
else
{
q=t;
if(p->cyy>q->cyy){
p->next=q;
t=p;
q->last=p;
}
else{
while(q->next!=NULL&&p->cyy<q->next->cyy)
q=q->next;
if(q->next!=NULL){
q->next=p;
q->last=p->last;
p->last=q;
}
else{
p->next=NULL;
p->last=q;
q->next=p;
w=p;
}
}
}
}
输出函数
void bs()
{
int i=0;
cout<<"--------------------------------------------------------------------------"<<endl;
if(t==NULL)cout<<"暂无学生信息"<<endl;
else{
struct xxx *p;
p=t;
cout<<"名次:"<<++i<<" "<<"学号:"<<p->xh<<" "<<"姓名:"<<p->xm<<" "<<"性别:"<<p->xb<<" "<<"年龄:"<<p->age<<" "<<"c语言成绩:"<<p->cyy<<endl;
while(p->next!=NULL){
cout<<"名次:"<<++i<<" "<<"学号:"<<p->next->xh<<" "<<"姓名:"<<p->next->xm<<" "<<"性别:"<<p->next->xb<<" "<<"年龄:"<<p->next->age<<" "<<"c语言成绩:"<<p->next->cyy<<endl;
p=p->next;
}
}
cout<<"--------------------------------------------------------------------------"<<endl;
}
删除函数
void sc()
{
if(t==NULL)cout<<"没有数据,你看不到吗???"<<endl;
else
{
long long v;
cout<<"输入要删除的学生的学号:"<<endl;
cin>>v;
struct xxx *p;
p=t;
if(p->xh==v){
t=p->next;
free(p);
}
else
{
while(p->next!=NULL&&(p->next->xh)!=v)
p=p->next;
if(p->next==NULL)cout<<"根本没有这个人"<<endl;
else{
if(p->next->next!=NULL)
{
p->next->next->last=p;
p=p->next;
p->last->next=p->next;
free(p);
}
else{
p=p->next;
p->last->next=NULL;
free(p);//记得每次去节点的时候要释放空间
}
}
}
}
}
退出函数
void exit()//主要是为了清空所有动态申请的地址,释放空间
{
if(t==NULL)f=0;
else{
struct xxx *p;
p=t;
while(p->next!=NULL)
{
t=t->next;
free(p);
p=t;
}
free(p);
f=0;
}
}
完整代码
#include<iostream>
#include<stdlib.h>
using namespace std;
struct xxx
{
long long xh;
char xm[10],xb;
int age,cyy;
struct xxx *next;
struct xxx *last;
};
struct xxx *t;
struct xxx *w;
int f=1;
void menu();
void sr();
void sc();
void bs();
void exit();
int main()
{
int op;
t=NULL;
w=NULL;
while(f){
system("cls");
menu();
bs();
cin>>op;
switch(op)
{
case 1:
cout<<"依次输入学号、姓名、性别、 年龄、C 语言的成绩"<<endl;
sr();
break;
case 2:
sc();
break;
case 3:
exit();
break;
}
system("pause");
}
return 0;
}
void menu()
{
cout<<"1:输入一个学生的基本信息"<<endl<<"2:输入一个学生的学号删除该学生的信息"<<endl<<"3:退出"<<endl;
cout<<"如果要退出,请按3和回车键,不要点X!!!!!!!!!!!!!"<<endl;
}
void bs()
{
int i=0;
cout<<"--------------------------------------------------------------------------"<<endl;
if(t==NULL)cout<<"暂无学生信息"<<endl;
else{
struct xxx *p;
p=t;
cout<<"名次:"<<++i<<" "<<"学号:"<<p->xh<<" "<<"姓名:"<<p->xm<<" "<<"性别:"<<p->xb<<" "<<"年龄:"<<p->age<<" "<<"c语言成绩:"<<p->cyy<<endl;
while(p->next!=NULL){
cout<<"名次:"<<++i<<" "<<"学号:"<<p->next->xh<<" "<<"姓名:"<<p->next->xm<<" "<<"性别:"<<p->next->xb<<" "<<"年龄:"<<p->next->age<<" "<<"c语言成绩:"<<p->next->cyy<<endl;
p=p->next;
}
}
cout<<"--------------------------------------------------------------------------"<<endl;
}
void sr()
{
struct xxx *p,*q;
p=(struct xxx *)malloc(sizeof(struct xxx));
cout<<"输入学号"<<endl;
cin>>(p->xh);
cout<<"输入姓名"<<endl;
cin>>(p->xm);
cout<<"输入性别"<<endl;
cin>>(p->xb);
cout<<"输入年龄"<<endl;
cin>>(p->age);
cout<<"输入c语言成绩"<<endl;
cin>>(p->cyy);
if(t==NULL){
t=p;
w=p;
p->next=NULL;
p->last=NULL;
}
else
{
q=t;
if(p->cyy>q->cyy){
p->next=q;
t=p;
q->last=p;
}
else{
while(q->next!=NULL&&p->cyy<q->next->cyy)
q=q->next;
if(q->next!=NULL){
q->next=p;
q->last=p->last;
p->last=q;
}
else{
p->next=NULL;
p->last=q;
q->next=p;
w=p;
}
}
}
}
void sc()
{
if(t==NULL)cout<<"没有数据,你看不到吗???"<<endl;
else
{
long long v;
cout<<"输入要删除的学生的学号:"<<endl;
cin>>v;
struct xxx *p;
p=t;
if(p->xh==v){
t=p->next;
free(p);
}
else
{
while(p->next!=NULL&&(p->next->xh)!=v)
p=p->next;
if(p->next==NULL)cout<<"根本没有这个人"<<endl;
else{
if(p->next->next!=NULL)
{
p->next->next->last=p;
p=p->next;
p->last->next=p->next;
free(p);
}
else{
p=p->next;
p->last->next=NULL;
free(p);
}
}
}
}
}
void exit()
{
if(t==NULL)f=0;
else{
struct xxx *p;
p=t;
while(p->next!=NULL)
{
t=t->next;
free(p);
p=t;
}
free(p);
f=0;
}
}