数据结构 程序设计 用双向循环链表建立一个学生管理系统,要求实现插入,删除,排序,修改等功能。

定义学生结构体类型struct Student,每个学生包括学号、姓名、3门功课(课程名自己定义)、总分。
(2)建立双向循环链表:输入若干学生的信息(当输入学生的学号为0000时结束,要求自动计算总分),并按输入的顺序建立双向循环链表;
(3)输出学生成绩信息:遍历双向循环链表,输出所有学生的完整信息到屏幕;
(4)查找指定学号的学生信息。如果查找成功,输出所有学生信息,否则输出失败。
(5)插入学生信息:以队列的方式将新学生成绩信息插入到链表中
(6)删除学生信息:给出学生姓名,删除链表所有相同姓名的学生的信息(即姓名相同的结点);
(7)修改学生信息:给出学生学号,修改该生的三门课程成绩信息;
(8)按总分排序:在原来的双向循环链基础上按总分降序进行就地排列。即不能增加额外的空间开销;
c++编写的,我有源代码,但编译没错,一运行就有错,希望哪位高手留下qq细谈,好的话我在追加20分。

用一下我的吧
是我大一时写的
有什么问题可以追问

#include<iostream.h>
#include<string.h>

typedef struct
{
char name[10];
long num;
float score;
}student;

void creat(student stu[]);
void insert(student stu[]);
void Delete(student stu[]);
void lookup(student stu[]);
void update(student stu[]);
void stat(student stu[]);
int length(student stu[]);
void print(student stu[]);

/*********************************
创建学生信息线性表
*********************************/
void creat(student stu[])
{
cout<<"请输入学生人数:";
int n;
cin>>n;
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<endl;
for(int i=1;i<=n;i++)
{
char newname[10];
long newnum;
float newscore;
cin>>newname;
strcpy(stu[i].name,newname);
cin>>newnum;
stu[i].num=newnum;
cin>>newscore;
stu[i].score=newscore;
}
strcpy(stu[i].name," ");
stu[i].num=0;
stu[i].score=0;
}
/*************************************
依次输出线性表中的学生成绩信息
*************************************/

void print(student stu[])
{
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<'\n';
int i=1;
while(i<=length(stu))
{
cout<<stu[i].name<<'\t'<<stu[i].num<<'\t'<<stu[i].score<<'\n';
i++;
}
cout<<'\n';
}
/**********************************
根据学号查询线性表中某个学生成绩信息
**********************************/
void lookup(student stu[])
{
cout<<"请输入你要查询的学号:";
long num;
cin>>num;
int i=1;
while(stu[i].num)
{
if(stu[i].num==num)
{
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<'\n';
cout<<stu[i].name<<'\t'<<stu[i].num<<'\t'<<stu[i].score<<'\n';
break;
}
i++;
}
if(!stu[i].num)
{
cout<<"你要查询的学号不存在,请重新输入!"<<'\n';
lookup(stu);
}
cout<<'\n';
}
/********************************
在线性表的某个位置上插入学生信息
********************************/
void insert(student stu[])
{
if(length(stu)==100)
{
cout<<"存储空间已满,不能进行插入操作!"<<'\n';
}
else
{
cout<<"请输入要插入的位置:";
int m;
cin>>m;
int n=length(stu);
if(m>n+1)
{
cout<<"插入位置不正确,请重新插入!"<<'\n';
insert(stu);
}
else
{
for(int i=n+1;i>=m;i--)
{
strcpy(stu[i+1].name,stu[i].name);
stu[i+1].num=stu[i].num;
stu[i+1].score=stu[i].score;
}
cout<<"请依次输入姓名,学号,成绩"<<'\n';
char newname[10];
long newnum;
float newscore;
cin>>newname;
strcpy(stu[m].name,newname);
cin>>newnum;
stu[m].num=newnum;
cin>>newscore;
stu[m].score=newscore;
}
}
}
/*******************************************
查询线性表中有效数据的长度
*******************************************/
int length(student stu[])
{
int i=1;
while(stu[i].num)
{
i++;
}
return (i-1);
}
/*****************************************
根据学号删除线性表中对应的学生信息
*****************************************/
void Delete(student stu[])
{
cout<<"请输入你要删除的学号:";
long num;
cin>>num;
int i=1;
while(stu[i].num)
{
if(stu[i].num==num)
{
int n=length(stu);
for(int j=i;j<n;j++)
{
strcpy(stu[i].name,stu[i+1].name);
stu[i].num=stu[i+1].num;
stu[i].score=stu[i+1].score;
}
strcpy(stu[j].name," ");
stu[j].num=0;
stu[j].score=0;
break;
}
i++;
}
if(!stu[i].num)
{
cout<<"你要删除的学号不存在,请重新输入!"<<'\n';
Delete(stu);
}
}

/*****************************************
统计各成绩段的学生信息
*****************************************/
void stat(student stu[])
{
cout<<"不及格的学生是:"<<'\n';
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<'\n';
int i=1;
while(stu[i].num)
{
if(stu[i].score<60)
{
cout<<stu[i].name<<'\t'<<stu[i].num<<'\t'<<stu[i].score<<'\n';
}
i++;
}
cout<<'\n';

cout<<"成绩为‘良’的学生是:"<<'\n';
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<'\n';
i=1;
while(stu[i].num)
{
if(stu[i].score>=60 && stu[i].score<75)
{
cout<<stu[i].name<<'\t'<<stu[i].num<<'\t'<<stu[i].score<<'\n';
}
i++;
}
cout<<'\n';

cout<<"成绩为‘中’的学生是:"<<'\n';
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<'\n';
i=1;
while(stu[i].num)
{
if(stu[i].score>=75 && stu[i].score<90)
{
cout<<stu[i].name<<'\t'<<stu[i].num<<'\t'<<stu[i].score<<'\n';
}
i++;
}
cout<<'\n';

cout<<"成绩为‘优’的学生是:"<<'\n';
cout<<"姓名"<<'\t'<<"学号"<<'\t'<<"成绩"<<'\n';
i=1;
while(stu[i].num)
{
if(stu[i].score>=90)
{
cout<<stu[i].name<<'\t'<<stu[i].num<<'\t'<<stu[i].score<<'\n';
}
i++;
}
cout<<'\n';
}
/********************************************
修改线性表中某个位置的学生信息
********************************************/
void update(student stu[])
{
cout<<"请输入要修改的位置:";
int m;
cin>>m;
if(m>length(stu))
{
cout<<"你要修改的位置不存在,请重新输入!"<<'\n';
update(stu);
}
else
{
cout<<"请依次输入更改后的姓名,学号,成绩"<<'\n';
char newname[10];
long newnum;
float newscore;
cin>>newname;
strcpy(stu[m].name,newname);
cin>>newnum;
stu[m].num=newnum;
cin>>newscore;
stu[m].score=newscore;
}
}
/******************************************************
主函数,调用类student的成员函数以实现相应功能
******************************************************/
void main()
{
cout<<"首先建立学生管理系统!"<<'\n';
student stu[101];
creat(stu);
print(stu);
cout<<"len:"<<length(stu)<<endl;
int j=100;
cout<<"请选择您要进行的操作(1为插入,2为删除,3为查找,4为修改,5为统计,0为取消操作)";
while(j)
{
cout<<"请您选择要进行的操作:";
cin>>j;
switch(j)
{
case 1:
{
insert(stu);
print(stu);
break;
}
case 2:
{
Delete(stu);
print(stu);
break;
}
case 3:
{
lookup(stu);
break;
}
case 4:
{
update(stu);
print(stu);
break;
}
case 5:
{
stat(stu);
break;
}
default:
break;
}
}
cout<<"线性表中共有"<<length(stu)<<"个学生";
}追问

这个不满足实验要求啊。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
int num;
char name[10];
float score[3];
float total;
struct student *next,*prior;
}DLNode,*DLinkList;

//建立链表
DLinkList Creat_DLinkList()
{
int x;
char y[10];
float s[3];
DLinkList DL=NULL;
DLNode *p=NULL,*q=NULL;
DL=malloc(sizeof(DLNode));
if(DL==NULL)
exit(0);
q=DL;
DL->next=NULL;
DL->prior=NULL;
printf("\nPlease enter students' information:\n");
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
while(x!=0)
{
int i;
p=malloc(sizeof(DLNode));
p->num=x;
strcpy(p->name,y);
for(i=0;i<3;i++)
p->score[i]=s[i];
p->total=p->score[0]+p->score[1]+p->score[2];
q->next=p;
p->prior=q;
p->next=DL;
q=p;
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
}
DL->prior=q;
return q;
}

//查找
int search(DLinkList r,int n)
{
DLNode *p,*h;
h=r->next;
p=h->next;
while(p!=h)
{
if(p->num==n)
return 1;
p=p->next;
}
return 0;
}

//添加
DLinkList add(DLinkList r)
{
int x;
char y[10];
float s[3];
DLNode *h=r->next,*p=NULL;
p=malloc(sizeof(DLNode));
printf("\nPlease enter students' information:\n");
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
while(x!=0)
{
int i;
p=malloc(sizeof(DLNode));
p->num=x;
strcpy(p->name,y);
for(i=0;i<3;i++)
p->score[i]=s[i];
p->total=p->score[0]+p->score[1]+p->score[2];
p->prior=r;
r->next=p;
p->next=h;
h->prior=p;
r=p;
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
}
return r;
}

//删除
void delete(DLinkList r)
{
char na[10];
DLNode *h=r->next;
DLNode *p=h->next;
DLNode *q=NULL;
while(p!=h)
{
q=p->next;
while(q!=h)
{
if(!strcmp(q->name,p->name))
{
q->prior->next=q->next;
q->next->prior=q->prior;
free(q);
}
q=q->next;
}
p=p->next;
}
}

//修改
int modify(DLinkList r,int n)
{
float s[3];
int i;
DLNode *h=r->next;
DLNode *p=h->next;
while(p!=h)
{
if(p->num==n)
{
printf("\nPlease enter new score:\n");
scanf("%f%f%f",&s[0],&s[1],&s[2]);
for(i=0;i<3;i++)
p->score[i]=s[i];
p->total=p->score[0]+p->score[1]+p->score[2];
break;
}
p=p->next;
}
if(p==h)
return 0;
else
return 1;
}

//排序
DLinkList sort(DLinkList r)
{
DLNode *t=NULL,*s=NULL;
DLNode *h=r->next;
DLNode *p=h->next;
DLNode *q=NULL;
while(p!=h)
{
q=h->next->next;
while(q!=h)
{
t=q->prior;
if(t->total<q->total)
{
s=t->prior;
t->next=q->next;
q->next->prior=t;
t->prior=q;
q->next=t;
q->prior=s;
s->next=q;
q=t;
}
q=q->next;
}
p=p->next;
}

return h->prior;
}

//输出
void print_DLinkList(DLinkList r)
{
int i;
DLNode *p,*h;
h=r->next;
p=h->next;
while(p!=h)
{
printf("number:%3d\tname:%s\tscore:%5.2f\t%5.2f\t%5.2f\ttotal:%5.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->total);
p=p->next;
}
}

//释放内存
void destory(DLinkList r)
{
DLNode *h,*p,*t=NULL;
h=r->next;
p=h->next;
while(p!=h)
{
t=p->next;
free(p);
p=t;
}
free(h);
}

int main()
{
DLinkList r;
int x,n,k;
r=Creat_DLinkList();
print_DLinkList(r);
printf("\nChoose what you want:\n");
printf("1:Search information:\n");
printf("2:Add information:\n");
printf("3:Delete same name:\n");
printf("4:Modify score:\n");
printf("5:Sort degrdation:\n");
scanf("%d",&x);
switch(x)
{
case 1: printf("\nPlease enter a number:");
scanf("%d",&n);
k=search(r,n);
if(k)
print_DLinkList(r);
else
printf("\nerror!!!\n");
break;
case 2: r=add(r);
print_DLinkList(r);
break;
case 3: delete(r);
print_DLinkList(r);
break;
case 4: printf("\nPlease enter a number:");
scanf("%d",&n);
k=modify(r,n);
if(k)
print_DLinkList(r);
else
printf("\nNot found!!!\n");
break;
case 5: r=sort(r);
print_DLinkList(r);
break;
default:printf("\nEnter error!!!\n");
}

destory(r);
return 0;
}

最近在学这里,所以就帮楼主编了一下,顺便巩固巩固所学。lz有什么不懂的尽管问,我会尽量回答的。追问

这个运行出错一个
DL=malloc(sizeof(DLNode));
另外是c++哈

追答

好吧,我以为是C语言呢,C++不会,那个我编译运行没错,不过排序那里错了!
可以试一下 DL=(DLinkList)malloc(sizeof(DLNode));

追问

其实c++与c没好大个区别,输出的printfg改为cout等语法外,其他都一样。
你刚才说的我用vc运行,还是有错。因为你的删除函数中void delete 与系统内重合了,所有改为delet就行了,另外输入学生学号数据的时候要求输入0000结束,这个我试了好像不行。
还是谢谢你,这个整体编的不错。

追答

输入学号0000结束时,还是要输入其他信息的。可以输 0000 0 0 0 0

本回答被提问者和网友采纳
相似回答