C语言程序设计 链表的综合操作(急)

《高级程序设计语言》(用WIN-TC软件)
课程设计
一、课程设计的问题描述
用C语言编写一个程序,通过链表的建立、输出、删除、插入等基本操作,实现学生成绩管理,从键盘输入学生信息,学生信息用结构体表示,包括学号、姓名、三门课成绩:语文、数学、英语。
二、课程设计目标和要求
必做:
1. 插入功能:在学生链表中插入一个学生的信息,要求插入后仍然保持学号有序。
2. 删除功能:要求输入指定的学号,从学生链表中删除该学生信息,删除后学号仍保持有序。
3.输出功能:要求按学号顺序将链表信息输出。
选做:
1. 计算总分、平均分功能:要求输入指定的学号,输出该学生的总分、平均分。
2. 查找功能:输入指定学号,从学生链表中找到该学生信息并输出。

补充部分说明:
先定义全局变量 a b c d,再做如下更改
(1)
scanf("%ld%s%f%f%f",& p1->num,p1->name,& p1->score[0],& p1->score[1],& p1->score[2]);
(2)
scanf("%ld%s%f%f%f",&a,p1->name,&b,&c,&d);
p1->num=a;
p1->score[0]=b;
p1->score[1]=c;
p1->score[2]=d;
采用形式(2)
TC WinTC 不支持形式(1)

注:
我只写了必做部分的程序,虽然编译正确但运行结果不对。我编的程序如下,希望高手在以下程序的基础上更改并帮忙做好选做部分。如果感觉以下程序不好用也可重新编写,急需,谢谢。
由于字数限制,我会用另一个号把我自己写的程序发到问题下面第一个回答中,谢谢大家的帮忙。
下面的程序中有错误定义的地方:把"student"写成了"sutdent".
能有高手在明天中午以前搞定的吗?有点急。

一、课程设计与目的
根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。
二、课程设计基本要求
1、用数据结构的方法设计出的学生信息管理系统,能实现对学生信息的简单管理。
2、具体要求:
建立一个若干学生的信息登记表,每个学生的信息包括:学号、姓名、性别、成绩和系,建立一个管理系统。
程序运行时显示一个菜单形式,例如
**********学生信息管理系统**********
| 1. 输入信息 |
| 2. 显示所有信息|
| 3. 信息按学号排序|
| 4. 插入一条记录|
| 5. 删除一条记录|
| 6. 查找 |
| 7. 修改一条记录 |
| 8. 退出 |
其中:
(1)输入若干条记录
(2)显示所有记录
(3)按学号排序
(4)插入一些记录
(5)按学号查找,删除一条记录
(6)查找并显示一条记录
(7)修改一条记录
(8)退出程序

三、系统功能和结构
1、系统的功能
1设计一个简单学生信息管理系统,用户可以通过系统简单的管理学生信息。
2设计出一个菜单可以让用户选择所执行的内容。
3建立单结构体,输入学生的信息(学号、姓名和、性别、系和成绩)。
4根据单结构体的特点采用冒泡法以总分为标准排序学生信息。
5根据用户输入的学号信息,固定的查询学生的详细信息。
6根据用户的需求删除或者添加某学生的信息。
2、概要设计
主要数据结构描述
typedef struct student //定义结构类型
{
char num[15]; //学号
char name[20]; //姓名
char sex; //性别
int score; //成绩
char sdept[10]; //系
} ;
student stu[100]; //结构体数组变量

算法分析及程序流程图

该项目划分为7个模块加退出,主函数可以分别调用这些模块,然后通过个模块来实现各种需要的功能。

四、程序如何实现
模块详细设计
根据上面的流程图,下面分析每个模块具体的功能,包括每个模块的参数和得出的结果
函数名 int Input(student stu[],int n) //输入信息
入口参数 无
返回值 无
模块功能 建立单结构体并赋值,即录入学生的信息
模块1

函数名 void Display(student stu[],int n) //显示所有信息
入口参数 无
返回值 无
模块功能 用于显示和方便查找学号的学生成绩
模块2

函数名 void Sort_by_num(student stu[],int n) //对输入的信息按学号排序
入口参数 无
返回值 无
模块功能 用于对学生按学号排序便于查看
模块3

函数名 int Insert_a_record(student stu[],int n) //插入一些记录
入口参数 无
返回值 无
模块功能 用于追加新的学生信息
模块4

函数名 int Delete_a_record(student stu[],int n) //查找,删除一个记录
入口参数 无
返回值 无
模块功能 用于删除学生一些信息
模块5

函数名 void Query_a_record(student stu[],int n) //查找并显示一个记录
入口参数 无
返回值 无
模块功能 用于查找并显示一个记录
模块6

函数名 void Replace_a_record(student stu[],int n) //按学号查找修改
入口参数 无
返回值 无
模块功能 按学号查找并修改一个学生信息
模块7

函数名 exit(8)
入口参数 无
返回值 无
模块功能 退出应用程序
模块8

五、程序源代码

程序正文部分
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
typedef struct student //定义结构类型
{
char num[15]; //学号
char name[20]; //姓名
char sex; //性别
int score; //成绩
char sdept[10]; //系
} ;
student stu[100]; //结构体数组变量

int menu_select() //菜单函数声明
{
char c;
do{
system("cls"); /*运行前清屏*/ ;
printf("\t\t**********学生信息管理系统**********\n"); /*菜单选择*/
printf("\t\t | 1. 输入信息 |\n");
printf("\t\t | 2. 显示所有信息|\n");
printf("\t\t | 3. 信息按学号排序|\n");
printf("\t\t | 4. 插入一条记录|\n");
printf("\t\t | 5. 删除一条记录|\n");
printf("\t\t | 6. 查找 |\n");
printf("\t\t | 7. 修改一条记录 |\n");
printf("\t\t | 8. 退出 |\n");
printf("\t\t************************************\n");
printf("\t\t\t 你的选择是(1-8):");
c=getchar(); //你的选择c
}while(c<'1'||c>'8');
return(c-'0');
}

int Input(student stu[],int n) //输入信息
{ int i=0;
char more;
while(more!='n'&&more!='N')
{printf("\t\t\t 请输入学生学号:");
scanf("\t\t\t %s",&stu[n+i].num);
printf("\t\t\t 请输入学生姓名:");
scanf("\t\t\t %s",&stu[n+i].name);
printf("\t\t\t 请输入学生性别:");
scanf("\t\t\t %c",&stu[n+i].sex);
printf("\t\t\t 请输入学生成绩:");
scanf("\t\t\t %d",&stu[n+i].score);
printf("\t\t\t 请输入学生所在系:");
scanf("\t\t\t %s",&stu[n+i].sdept);
printf("\t\t\t 您有更多信息要输入吗?Y/N:");
scanf("\t\t\t %c",&more);
i++;
}return(n+i);
}

void Display(student stu[],int n) //显示所有信息
{ int i;
printf(" ---------------------------------------------------------------\n"); /*格式头*/
printf(" | 学 号 | 姓 名 | 性别 | 成绩 | 所在系 |\n");
printf(" ---------------------------------------------------------------\n");
for(i=1;i<=n;i++)
{printf(" | %-15s| %-11s| %-5c| %-6d| %-12s|\n",stu[i-1].num,stu[i-1].name,
stu[i-1].sex,stu[i-1].score,stu[i-1].sdept );
printf(" ---------------------------------------------------------------\n"); //分格行
}
printf("\t\t\t");
system("pause");
}

void Sort_by_num(student stu[],int n) //对输入的信息按学号排序
{ int i,j;
char l[15],t[20],q,k[10];
int p;
for(i=0;i<=n-1;i++) //起泡法排序
for(j=0;j<n-1-i;j++)
if(strcmp(stu[j].num,stu[j+1].num)>0)
{ l=stu[j].num;
stu[j].num=stu[j+1].num;
stu[j+1].num=l;

t=stu[j].name;
stu[j].name=stu[j+1].name;
stu[j+1].name=t;

q=stu[j].sex;
stu[j].sex=stu[j+1].sex;
stu[j+1].sex=q;

p=stu[j].score;
stu[j].score=stu[j+1].score;
stu[j+1].score=p;

k=stu[j].sdept;
stu[j].sdept=stu[j+1].sdept;
stu[j+1].sdept=k;
}
}

int Insert_a_record(student stu[],int n) //插入一些记录
{ int i=0;
char more;
while(more!='n'&&more!='N')
{printf("\t\t\t 请输入学生学号:");
scanf("\t\t\t %s",&stu[n+i].num);
printf("\t\t\t 请输入学生姓名:");
scanf("\t\t\t %s",&stu[n+i].name);
printf("\t\t\t 请输入学生性别:");
scanf("\t\t\t %c",&stu[n+i].sex);
printf("\t\t\t 请输入学生成绩:");
scanf("\t\t\t %d",&stu[n+i].score);
printf("\t\t\t 请输入学生所在系:");
scanf("\t\t\t %s",&stu[n+i].sdept);
Sort_by_num(stu, n);
printf("\t\t\t Insert Successed!\n"); //插入成功
printf("\t\t\t 您有更多信息要输入吗?Y/N:");
scanf("\t\t\t %c",&more);
i++;
}return(n+i);
}

int Delete_a_record(student stu[],int n) //查找,删除一个记录
{ char l[15];
int i=0, j;
printf("\t\t\t 请输入学生学号:"); //按学号查找
scanf("\t\t\t %s",l);
while(strcmp(stu[i].num,l)!=0 && i<n)i++; //查找判断
if(i==n)
{printf("\t\t\tnot find!\n"); //查找失败
return(n);}
for(j=i;j<n-1;j++) //删除操作
{ strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].sex=stu[j+1].sex;
stu[j].score=stu[j+1].score;
strcpy(stu[j].sdept,stu[j+1].sdept);
}
printf("\t\t\t Delete Successed!\n"); //删除成功
return(n-1) ;
}

void Query_a_record(student stu[],int n) //查找并显示一个记录
{ char l[15];
int i=0;
printf("\t\t\t 请输入学生学号:"); //按学号查找
scanf("\t\t\t %s",l);
while(strcmp(stu[i].num,l)!=0 && i<n)i++; //查找判断
if(i==n)
{ printf("\t\t\tnot find!\n"); //查找失败
return;
}
printf("\t\t\t 学生的学号:%s\n",stu[i].num); //输出该学生信息
printf("\t\t\t 学生的姓名:%s\n",stu[i].name);
printf("\t\t\t 学生的性别:%c\n",stu[i].sex);
printf("\t\t\t 学生的成绩:%d\n",stu[i].score);
printf("\t\t\t 学生所在系:%s\n",stu[i].sdept);
}

void Replace_a_record(student stu[],int n) //按学号查找修改
{
char choice,l[15];
int i=0;
printf("\t\t\t 请输入学生学号:"); //按学号查找
scanf("\t\t\t %s",l);

while(strcmp(stu[i].num,l)!=0 && i<n)i++; //查找判断
if(i==n)
{printf("\t\t\tnot find!\n"); //查找失败
return;}

printf("\t\t\t请选择您要修改的学生的信息内容:\n");
printf("\t\t\t (1)修改学生姓名:\n");
printf("\t\t\t (2)修改学生性别\n:");
printf("\t\t\t (3)修改学生成绩:\n");
printf("\t\t\t (4)修改学生所在系:\n");
printf("\t\t\t (5)取消 请按 5 \n");
printf("\t\t\t 请输入您的选择:\n");
scanf("%d", &choice);
switch(choice)
{
case 1:

printf("\t\t\t 请输入新姓名:\n");
scanf("%d", stu[i].name);
break;
case 2:

printf("\t\t\t 请输入新性别:\n");
scanf("%s", stu[i].sex);

printf("\t\t\t");
system("pause");
break;
case 3:

printf("\t\t\t 请输入新成绩:\n");
scanf("%s", stu[i].score);
printf("\t\t\t");
system("pause");
break;
case 4:

printf("\t\t\t 请输入新的所在系:\n");
scanf("%s", stu[i].sdept);
printf("\t\t\t");
system("pause");

break;
case 5:
printf("您选择了取消,Bye-Bye!\n") ;
exit;

}
}

void main() //主函数
{
int n=0;
for(;;) //相当于while(1)语句,不设初值,认为表达式2为真值,循
//环变量不增值,无终止的执行循环
{

switch(menu_select())
{
case 1:
printf("\t\t\tInput Records\n"); //输入若干条记录
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); //显示所有记录
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); //按学号排序
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); //插入一些记录
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); //按姓名查找,删除一条记录
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); //查找并显示一个记录
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\treplace\n"); //修改一条信息
Replace_a_record(stu,n);
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); //结束程序
printf("\t\t\t");
system("pause");
exit(8);
}
} }
六、 程序的运行与实现
(1)输入若干条记录

(2)显示所有记录

(3)按学号排序

(4)插入一些记录

(5)按学号查找,删除一条记录

(6)查找并显示一条记录

(7)修改一条记录

(8)退出程序
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-17
我是问题提问者【rimu293】以下为我编写的程序:
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{long num;
char name[20];
float score[3];
struct student * next;
};
int n;long a;float b,c,d;
struct student * creat(void)
{struct student * head;
struct student * p1,* p2;
n=0;
p1=p2=(struct student *)malloc(LEN);
scanf("%ld,%s,%f,%f,%f",&a,p1->name,&b,&c,&d);
p1->num=a;
p1->score[0]=b;
p1->score[1]=c;
p1->score[2]=d;
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%ld,%s,%f,%f,%f",&a,p1->name,&b,&c,&d);
p1->num=a;
p1->score[0]=b;
p1->score[1]=c;
p1->score[2]=d;
}
p2->next=NULL;
return(head);
}
void print(struct student * head)
{struct student * p;
printf("\nNow,These %d records are:\n",n);
p=head;
if(head!=NULL)
do
{printf("%ld,%s,%f,%f,%f\n",a,p->name,b,c,d);
p=p->next;
}while(p!=NULL);
}
struct student * insert(struct student * head,struct sutdent * stud)
{struct sutdent * p0,* p1,* p2;
p1=head;
p0=stud;
if(head==NULL)
{head=p0;p0->next=NULL;}
else
{while((p0->num>p1->num))
{p2=p1;
p1=p1->next;}
if(p0->num<=p1->num)
{if(head==p1)head=p0;
else p2->next=p0;
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;}
}
n=n+1;
return(head);
}
struct student * del(struct student * head,long num)
{struct student * p1,* p2;
if(head==NULL)
p1=head;
while(num!=p1->num&&p1->next!=NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
{if(p1==head)head=p1->next;
else p2->next=p1->next;
printf("delete:%ld\n",num);
n=n-1;
}
else printf("%ld not been found!\n",num);
end:;
return(head);
}
void main()
{struct student * head,* stu;
long del_num;
printf("input records:\n");
head=creat();
print(head);
printf("\ninput the insertd record:");
stu=(struct student *)malloc(LEN);
scanf("%ld,%s,%f,%f,%f",&a,stu->name,&b,&c,&d);
while(stu->num!=0)
{head=insert(head,stu);
print(head);
printf("input the inserted record:");
stu=(struct student *)malloc(LEN);
scanf("%ld,%s,%f,%f,%f",&a,stu->name,&b,&c,&d);
}
printf("\ninput the deleted number:");
scanf("%ld",&del_num);
while(del_num!=0)
{head=del(head,del_num);
print(head);
printf("input the deleted number:");
scanf("%ld",&del_num);}
getch();
}
辛苦了,谢谢帮忙。
相似回答