C语言算法链表学生系统

要能够执行的代码
什么是链表阿。。。
2楼你得代码执行结果不对
7楼谢谢你,没有更好的答案就选你了
在等等,有更好的答案,在加50分

=================================================================================
链表概述
链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
=================================================================================
学生管理系统源代码:

#include<stdio.h>
const NAME=20;
const N=10;

//学生信息
static struct student
{
int number;
char name[NAME];
int subject[3];
int average;
}st;

//链表的构造
struct sl
{
struct student st;
int next;
}s[N];

//信息输入
int input(struct sl *ps);
//信息输出
void output(struct sl *ps);
//信息的查找
int find(int nu, struct sl *ps);
//信息的删除
int delet(int nu, struct sl *ps);
//信息的修改
int amend(int nu, struct sl *ps);
//菜单
void menu();
//输入的学生人数
static int k=0;

//主函数
void main()
{
struct sl *p;
p=s;
printf("#####################################################################\n");
printf("请输入学生的人数:");
scanf("%d", &k);
input(p);
menu();
int sw, nub;
int flag=1;
while(flag)
{
printf("\n菜单选项 (1-5) :");
scanf("%d",&sw);
switch(sw)
{
case 1: printf("检索\n");
printf("number: ");
scanf("%d",&nub);
find(nub,p);
printf("search end!");
break;
case 2: printf("修改\n");
printf("number: ");
scanf("%d",&nub);
amend(nub,p);
printf("modify end!");
break;
case 3: printf("删除\n");
printf("number: ");
scanf("%d",&nub);
delet(nub, p);
printf("delete end!");
break;
case 4: printf("显示\n");
output(p);
break;
case 5: printf("退出\n");
flag=0;
break;
}
}
}
int input(struct sl *ps)
{
ps[0].next=1;
for(int i=1; i<=k; i++)
{
printf("学号:"); scanf("%d",&ps[i].st.number);
printf("姓名:");
scanf("%s", ps[i].st.name);
printf("请输入三门学科的成绩\n");
for(int j=0; j<3; j++)
{
printf("科目%d:",j+1);
scanf("%d", &ps[i].st.subject[j]);
}
printf("\n");
ps[i].next=i+1;
if((ps[i].next)==k+1)
ps[i].next=0;
}
printf("输入结束!\n");
return 0;
}

void output(struct sl *ps)
{
struct sl *s;
printf("学生统计显示:\n");
s=ps;
int Next=0, i=1;

do
{
Next=s[Next].next;
printf("学号:%d\t姓名:%s\t", s[Next].st.number, s[Next].st.name);
for(int j=0; j<3; j++)
{
printf("科目%d:%d\t", j+1, s[Next].st.subject[j]);
}
printf("\n");
i++;
}while(Next!=0 && i<=k);
printf("显示结束!");
}

int find(int nu, struct sl *ps)
{
int Next=1, i=1;
int flag=0;
do
{
if(ps[Next].st.number==nu)
{
flag=1;
break;
}
Next=ps[Next].next;
i++;
}while(i<=k);
if(!flag)
printf("No Find!\n");
else
{ struct sl *s;
s=&ps[Next];
printf("学号:%d\t姓名:%s\t", s->st.number, s->st.name);
for(int j=0; j<3; j++)
{
printf("科目%d:%d\t", j+1, s->st.subject[j]);
}
printf("\n");
}
return flag;
}

int delet(int nu, struct sl *ps)
{
int result;
result=find(nu, ps);
if(result)
{
int Next=0, i=1;
do
{
if(ps[ps[Next].next].st.number==nu)
{
ps[Next].next=ps[ps[Next].next].next;
break;
}
Next=ps[Next].next;
i++;
}while(i<=k);
--k;
return 1;
}
else
return 0;
}

int amend(int nu, struct sl *ps)
{
int Next=1;
int i=1;
if(find(nu, ps))
{ do
{
if(ps[Next].st.number==nu)
break;
Next=ps[Next].next;
i++;
}while(i<=k);
printf("学号:"); scanf("%d", &ps[Next].st.number);
printf("\n");
printf("姓名:");
scanf("%s", ps[Next].st.name);
printf("\n");
printf("三科成绩:"); printf("\n");
for(int j=0; j<3; j++)
{
printf("科目%d:",j+1);
scanf("%d", &ps[Next].st.subject[j]);printf("\n");
}
} return 1;
}

void menu()
{
printf("******************MENU******************\n");
printf("========================================\n");
printf("1.检索\n");
printf("2.修改\n");
printf("3.删除\n");
printf("4.显示\n");
printf("5.退出\n");
printf("=========================================\n");
}
=================================================================================

上面的程序在VC++中运行成功,由于搂主是初学,所以程序比较简单,只有添加,检索,修改,删除,显示5个功能.这样便于楼主理解.

悉雨辰寂
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-04-28
你说要链表,, 自己怎么链表是什么都不知道。。 ?

你要纯结构体的么 ?

比线性表 链表 更低级一点。 比数组 高级一点。。

你如果结构体都还不清楚的话, 建议先掌握 这些基本的东西。。

链表 线性表 基础是 结构体。

=======================================

//

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NN 50 // 是学生人数上限 。可自己调整。
#define SCMAX 50 // 课程 数上限
int SCLoad;

typedef struct student{
char no[10];
char name[11];
double score[SCMAX];
double total;
double avg;
};
student stu[NN+1];

int display(int n,int m,int SC) //综合显示函数。
{
int i,j,temp,flag=0;
temp=n;
n>m?n=m,m=temp:1 ;
printf(" 序号 | 学 号 | 姓 名 |");
for(j=1;j<=SC;j++)
printf("课程%2d|",j);
printf(" 总 分 | 平均分 \n");

if((n==0&&m==0) || (!n&&!m))n=1,m=1;
if((n==0&&m!=0) || (n!=0&&m==0))
{ n=0?n=m:m=n;flag=stu[n].total==0?1:0;}
if(stu[1].total==0 || flag){printf("没有学生信息!");return 0;}

for(i=n;i<=m;i++)
if(stu[i].total>0)
{ printf(" %4d | %6s | %6s |",i,stu[i].no,stu[i].name);
for(j=0;j<SC;j++)
printf("%3.1lf ",stu[i].score[j]);
printf("| %3.2lf | %3.2lf \n",stu[i].total,stu[i].avg);
}
}

int searchmax(int n,int SC) //找最高分,并输出这个学生信息。
{ int i,j,k=1;
double max;
max=0;
for(i=1;i<=n;i++)
for(j=0;j<SC;j++)
if(stu[i].score[j]>max){
max=stu[i].score[j];
k=i;
}
display(k,k,SC);
printf(">>>最高分数:%3.1lf\n",max);
return k;
}

double avgsi(int n,int scorenum) //求 单科平均分
{ int i,j;
double s=0,avg;
for(i=1;i<=n;i++)s+=stu[i].score[scorenum-1];
return s/n;
}

int input(int i,int SC) //信息录入
{ int j;
flag: printf("输入第%d个学生学号:",i);
scanf("%s",stu[i].no);
printf("输入第%d个学生姓名:",i);
fflush(stdin);
gets(stu[i].name);
printf("输入第%d个学生成绩依次为(1 2 3....)空格隔开\n ",i);
stu[i].total=0;
stu[i].avg=0;
for(j=0;j<SC;j++){
scanf("%lf",&stu[i].score[j]);
//
stu[i].total+=stu[i].score[j];
}
stu[i].avg=stu[i].total/SC;
if(stu[i].no&&stu[i].name&&stu[i].total&&stu[i].avg)return 1;
else {printf("输入信息不完整,请重新输入!");goto flag;}
return 1;
}

void sortbyavg(int n) //按平均分高到低排序
{
int i,j;
student temp;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].avg<stu[j].avg){
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
printf("排序完成!");
return;
}
int sortbyscid(int n,int SC) //按输入的课程名,分数从高到低排序
{

int i,j,k;
int p;
student temp;
printf("请输入排序参考课程id:");
scanf("%d",&p);

if(p>SC||p<=0){printf("无法排序,原因没有这门课!\n");
return 0;}

for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].score[p-1]<stu[j].score[p-1]){temp=stu[i];stu[i]=stu[j];stu[j]=temp;}

printf("排序完成!");
return 1;
}

void displaysample(int n) //显示总分和平均分
{ int i;
printf(" 序 号 | 姓 名 | 总分 | 平均分 \n");
for(i=1;i<=n;i++)
if(stu[i].total!=0)printf(" %5d %s %.2lf %.2lf\n",i,stu[i].name,stu[i].total,stu[i].avg);
return;
}

void dispsavg(int n) //显示各科的平均分
{ int i;
double k;
for(i=1;i<=SCMAX;i++){
k=avgsi(n,i);
if(k==0)return;
printf("<课程%2d > 平均分:%.2lf\n",i,k);
}
}

void help()
{
printf(" +++++++++欢迎使用本帮助!++++++++ \n");
printf(" 以下是功能菜单\n");
printf(" 在提示符\">>\"下有以下命令可用!\n");
printf(" A 显示所有信息;\n B 显示总分,平均分;\n C 平均分排序;\n D显示各科平均分;\n");
printf(" E 按输入课程名排序;\n F找最高分学生输出;\n S 将信息保存到文件;\n O 打开已存在的数据文件;\n");
printf(" I 学生信息输入;\n H 显示本帮助。\n Z 结束程序!\n");
printf("\n>>");}

int save(int n) //将信息保存在一个文件中。
{
FILE *fp;
int i;
char stu_msg[20];
printf("输入要保存的文件名:");
scanf("%s",stu_msg);
if((fp=fopen(stu_msg,"w"))==NULL)
{
printf("无法打开文件!\n");
return 0;
}
for(i=1;i<=n;i++)
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)
printf("文件写入错误!");
fclose(fp);
printf("保存成功!");
}

int openf() //文件放在程序同目录下。
{
FILE *fp;
int i;
char stu_msg[20];
printf("输入要打开的文件名:");
scanf("%s",stu_msg);
if((fp=fopen(stu_msg,"r"))==NULL)
{printf("无法打开文件!\n");return 0;}
for(i=1;i<=NN;i++)
if(fread(&stu[i],sizeof(student),1,fp)!=1 )
{ SCLoad=0;
while(stu[1].score[SCLoad++]!=0);
printf("读入结束!\n");
return i;}
fclose(fp);
}

int main()
{
int i,j,n;
int SC ;
char cc,runfirst;

printf("\n\n\n\n是否从已有文件中获得学生信息?Y/N:");
runfirst=getchar();
if(runfirst=='Y'||runfirst=='y'){n=openf();SC=SCLoad-1;}
else {
flag: printf("输入学生人数( <=%d ):",NN);
scanf("%d",&n);
printf("输入课程数( <=%d ):",SCMAX);
scanf("%d",&SC);
while(n>NN){
printf("超出允许范围(<=%d),请重新输入:",NN);
scanf("%d",&n);}
for(i=1;i<=n;i++)input(i,SC);
printf("输入完毕!\n");
}
system("pause");
system("cls");
printf("\n\n\n");
help();
printf("你想进行什么操作?\n");
printf(">>");
while(cc=getchar())
{
switch(cc)
{
case 'I':case 'i':goto flag;break;
case 'A':case 'a':display(1,n,SC);break;
case 'B':case 'b':displaysample(n);break;
case 'C':case 'c':sortbyavg(n);break;
case 'D':case 'd':dispsavg(n);break;
case 'E':case 'e':sortbyscid(n,SC);break;
case 'F':case 'f':searchmax(n,SC);break;
case 'H':case 'h':help();break;
case 'S':case 's':save(n);break;
case 'O':case 'o':n=openf();SC=SCLoad-1;break;
case 'Z':case 'z':printf("谢谢!\n");return 0;
}
printf("\n>>");
fflush(stdin);
}
return 0;
}
第2个回答  2008-04-28
我同意5楼的意见,给你源码是害你,你要从基础学起,自己试试,链表不难的
第3个回答  2008-04-24
#include "stdio.h"
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
int number;
char name[10];
float yuwen;
float yingyu;
float shuxue;
float aver;
struct student *next;
};
typedef struct student node;
typedef node *link;
int n;
/*建立菜单*/
void menu(void)
{printf("---------------主菜单---------------\n");
printf("-------输入'1',输入学生成绩---------\n");
printf("-------输入'2',查询学生成绩---------\n");
printf("-------输入'3',修改学生成绩---------\n");
printf("-------输入'4',添加学生成绩---------\n");
printf("-------输入'5',删除学生成绩---------\n");
printf("-------输入'6',按照平均分排序-------\n");
printf("-------输入'7',显示学生成绩---------\n");
printf("-------输入'8',显示全班总平均分-----\n");
printf("-------输入'9',退出-----------------\n");
}

/*建立数据信息即链表*/
link creat(void)
{
link head,p1,p2;
head=NULL;
n=0;
p1=p2=(link)malloc(sizeof(node));
printf("请输入学号,输入'0'结束:\n");
scanf("%d",&p1->number);
while(p1->number)
{
printf("姓名:");
scanf("%s",p1->name);
printf("语文成绩:");
scanf("%f",&p1->yuwen);
printf("英语成绩:");
scanf("%f",&p1->yingyu);
printf("数学成绩:");
scanf("%f",&p1->shuxue);
p1->aver=(p1->yuwen+p1->yingyu+p1->shuxue)/3;
n++;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(link)malloc(sizeof(node));
printf("请输入学号,输入'0'结束:\n");
scanf("%d",&p1->number);
}
p2->next=NULL;
return(head);
}

/*查找并显示信息按照学号*/
void find(link head)
{
link p;
int number;
int flag=1;
char c;
if(head==NULL)printf("信息系统为空!无法查询!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("请输入要查询学生的学号: ");
scanf("%d",&number);
getchar();
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("要查找的学号为%d的学生信息如下:\n",number);
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
break;
}
else p=p->next;
}
if(p==NULL)printf("学号为%d的学生不存在!\n",number);
printf("是否继续查询?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
}
}

/*修改学生成绩信息*/
void modi(link head)
{
link p;
int number;
int tnumber;
char tname[10];
float tyuwen,tyingyu,tshuxue,taver;
int flag=1;
char c;
if(head==NULL)printf("学生成绩系统为空!无法修改!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("请输入要修改的学生学号: ");
scanf("%d",&number);
getchar();
p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("学号: ");
scanf("%d",&tnumber);
printf("姓名:");
scanf("%s",tname);
printf("语文成绩:");
scanf("%f",&tyuwen);
printf("英语成绩:");
scanf("%f",&tyingyu);
printf("数学成绩:");
scanf("%f",&tshuxue);
getchar();
taver=(tyuwen+tyingyu+tshuxue)/3;
printf("是否保存?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='y'||c=='Y')
{
p->number=tnumber;
strcpy(p->name,tname);
p->yuwen=tyuwen;
p->yingyu=tyingyu;
p->shuxue=tshuxue;
p->aver=taver;
printf("保存成功!\n");
}
break;
}
else p=p->next;
}
if(p==NULL)printf("学号为%d的学生成绩信息不存在!!!\n",number);
printf("是否继续修改?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
}
}

/*插入学生信息*/
link insert(link head)
{
link p,p1;
int flag=1;
char c;
while(flag)
{
p=(link)malloc(sizeof(node));
printf("输入学号: ");
scanf("%d",&p->number);
printf("姓名:");
scanf("%s",p->name);
printf("语文成绩:");
scanf("%f",&p->yuwen);
printf("英语成绩:");
scanf("%f",&p->yingyu);
printf("数学成绩:");
scanf("%f",&p->shuxue);
getchar();
p->aver=(p->yuwen+p->yingyu+p->shuxue)/3;
if(head==NULL)head=p;
else
{
p1=head;
while(p1->next!=NULL)p1=p1->next;
p1->next=p;
}
p->next=NULL;
n++;
printf("插入学生信息如下:\n");
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
printf("是否继续插入?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')
{
flag=0;
printf("按任意键回到主菜单!\n");
}
}
return(head);
}

/*删除学生信息*/
link del(link head)
{
link p,p2;
int flag=1;
int number;
char c;
if(head==NULL)printf("信息系统为空!无法删除!!!按任意键回到主菜单!\n");
else
{
while(flag)
{
printf("输入要删除的学生学号: ");
scanf("%d",&number);
getchar();
p2=p=head;
while(p!=NULL)
{
if(p->number==number)
{
printf("要删除的学号为%d的学生信息如下:\n",number);
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
printf("是否确定删除?(y/n) ");
scanf("%c",&c);
getchar();
if(c=='y'||c=='Y')
{
if(p==head)head=p->next;
else p2->next=p->next;
n--;
printf("删除成功!!\n");
}
break;
}
else
{
p2=p;
p=p->next;
}
}
if(p==NULL)printf("学号为%d的学生信息不存在!!!\n",number);
if(head==NULL)
{
printf("信息系统为空,无法继续删除!\n");
getchar();
break;
}
printf("是否继续删除?(y/n )");
scanf("%c",&c);
getchar();
if(c=='n'||c=='N')flag=0;
printf("按任意键回到主菜单!\n");
}
}
return(head);
}

/*输出学生成绩信息*/
void print(link head)
{
link p;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{
printf("一共有%d个学生的信息:\n",n);
p=head;
while(p)
{
printf("%-5d%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",p->number,p->name,p->yuwen,p->yingyu,p->shuxue,p->aver);
p=p->next;
}
printf("按任意键回到主菜单!\n");
}
}

/*用选择法排序*/
link sort(link head)
{
link beforep,p,p1,k,beforek,temp;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{p=head;
while(p->next!=NULL)
{
k=p;
p1=p->next;
while(p1!=NULL)
{
if(k->aver<p1->aver)k=p1;
p1=p1->next;
}
if(k!=p)
{
beforek=head;
while(beforek->next!=k)beforek=beforek->next;
if(p==head)head=k;
else beforep->next=k;
beforek->next=p;
temp=k->next;
k->next=p->next;
p->next=temp;
p=k;
}
beforep=p;
p=p->next;
}
printf("排序成功,按任意键回到主菜单!\n");
}
return(head);
}

/*求全班总平均分并显示*/
void average(link head)
{
float toaver,sum=0;
int num=0;
link p;
if(head==NULL)printf("信息系统为空!!!按任意键回到主菜单!\n");
else
{
p=head;
while(p!=NULL)
{
sum+=p->aver;
num++;
p=p->next;
}
toaver=sum/num;
printf("全班总平均分是:%7.2f\n",toaver);
printf("按任意键回到主菜单!\n");
}
}

void main()
{
int k;
int flag=1;
link head=NULL;
while(1)
{
menu();
flag=1;
while(flag)
{
printf("请输入:(1~9) ");;
scanf("%d",&k);
getchar();
if(k>=1&&k<=9)flag=0;
else printf("输入错误!\n");
}
switch(k)
{
case 1:head=creat();break;
case 2:find(head);break;
case 3:modi(head);break;
case 4:head=insert(head);break;
case 5:head=del(head);break;
case 6:head=sort(head);break;
case 7:print(head);break;
case 8:average(head);break;
case 9:return;
}
getch();
}
}
第4个回答  2008-04-25
什么是链表都不知道你要这代码也没有用啊,从基础学起吧
第5个回答  2008-04-25
........问得好啊~
惊起啊声一片~
相似回答