您的位置:首页 > 编程语言 > C语言/C++

C语言使用单链表的学生成绩管理系统

2013-07-08 00:22 1221 查看
本系统的代码冗余还是蛮多的,其实可以再精简很多,可是后期自己懒得改了,这里强调一个思想----代码复用,这会大大节约自己的编程量,也可以使自己看待一个向项目有宏观的思想。关于这个系统,是采用单链表和文件写的,单链表在数据录入部分已经按照学号排好序,后期的数据输出也即很方便看待数据,其实可以在后期进行排序,我的想法有两种,①创建一个结构体数组,把数据重新导入结构体数组中,再进行快速排序;②使用指针,不过这对数据结构以及指针的要求很高,基础不扎实还是不要乱试;不然会出现大量改也不知道怎么改的bug;关于文件部分
其实文件有大量的方法写入 比如二进制也可以 ,写起来都差不多 不过从文件读出来 和 写进去文件 的部分得多种方法试试 这样就可以加强基础了。 关于指针 这是头疼的问题 总之不能乱用 。关于链表的部分 看数据结构的基础了 这是数据结构最简单的部分 不过得细心和足够的耐心。

系统的图片如下:



以下为本系统的部分源码内含注释:
# include <stdio.h>
# include <conio.h>
# include <malloc.h>
# include <stdlib.h>

struct Node
{
int num;
int age;
char name[30];
char sex[5];
int sroce;
struct Node *next;
};

Node *head;

Node *Load()								//载入文件中的数据到结构体中
{
FILE *fp;
Node *cur,*p,*q;
cur = NULL;
fp = fopen("Student","r");   		//以"r"形式打开student的文件
if(fp == NULL)						//如果文件不存在
{
fp = fopen("Student","w");		//创立一个student文件
fclose(fp);						//关闭文件
return cur;						//返回链表中,存入head
}
p=(struct Node*)malloc(sizeof(struct Node)); 	//如果存在
if(fread(p,sizeof(struct Node),1,fp) != 1)		//判断文件中的数据 是否只有1个
return  cur;								//是就返回
cur = p;
while(!feof(fp)) 								//否则就开始从文件中读数据
{
q = p;
p = (struct Node *)malloc(sizeof(struct Node));
fread(p,sizeof(struct Node),1,fp);
q -> next = p;
}
q -> next = NULL;
free(p); 										//释放指针p所指向的内存空间
fclose(fp);
return cur;									 	//返回链表中,存入head
}

void Interface()								//主界面函数
{
system( "cls" );							//清屏函数
printf("\n\n\n");
printf("\t-----------------------------------------------------\n");
printf("\t-----------------------------------------------------\n");
printf("\t||                                                 ||\n");
printf("\t||                     首页                        ||\n");
printf("\t||                                                 ||\n");
printf("\t-----------------------------------------------------\n");
printf("\t-----------------------------------------------------\n");
printf("\t||                                                 ||\n");
printf("\t||                                                 ||\n");
printf("\t||                  ◆1.输入                       ||\n");
printf("\t||                  ◆2.查询                       ||\n");
printf("\t||                  ◆3.显示                       ||\n");
printf("\t||                  ◆4.删除                       ||\n");
printf("\t||                  ◆5.修改                       ||\n");
printf("\t||                  ◆0.退出                       ||\n");
printf("\t||                                                 ||\n");
printf("\t||                                                 ||\n");
printf("\t-----------------------------------------------------\n");
printf("\t-----------------------------------------------------\n");
return ;
}

void Add_Data()									//输入学生信息函数
{
Node *p,*q;
Node *cur;
char flag = '0';
cur = (struct Node *)malloc(sizeof(struct Node)); //创建新结点
while(flag == '0') 							//输入学生信息
{
q = p = head;
cur ->next = NULL;
printf("请输入姓名:");
scanf("%s",&cur -> name);
printf("请输入学号:");
scanf("%d",&cur -> num);
printf("请输入年龄 :");
scanf("%d",&cur -> age);
printf("请输入性别 :");
scanf("%s",&cur -> sex);
printf("请输入成绩 :");
scanf("%d",&cur -> sroce);
fflush(stdin);				//用来清空输入缓存,以便不影响后面输入的东西
if(head == NULL)head = cur;	//如果输入的节点是头一个,就把头结点head等于cur
else							//否则在头结点后面加入结点
{
while(p -> num < cur -> num && p -> next != NULL)	//按学号建立链表
{
q = p;											//P节点
p = p -> next;									//P后一接点
}
if(p -> num > cur -> num)							//找到head表中的学号大于新建学生的学号,插入学生信息
{
if(p == head)									//如果为头结点,前插
{
cur -> next = head;
head = cur;
}
else
{
q -> next = cur;
cur -> next = p;
}
}
else											//找不到比新建学生更大的学号,放在链表最好面
p -> next = cur;
}
cur = (struct Node *)malloc(sizeof(struct Node));     //又创建新结点,为下次输入准备
printf("输入结束,是否继续输入,按 0 键继续,否者退出.\n");
flag = getch();										//0就继续输入,其他键就返回主界面
fflush(stdin);										//清除缓冲区的数据
}
free(cur);
return ;
}

void Find_Data()								//按学号查找学生信息
{
Node *p;
int num;
char flag = '0';
bool  mark;
while(flag == '0')
{
printf("请输入要查找的学生的学号:  ");
scanf("%d",&num);
fflush(stdin);
mark = false;							//标记是否找到学生
p = head;							   //将头结点head赋值与p
if(head == NULL)					   //如果链表中头结点为空,则查询错误
{
printf("查询失败.\n");
printf("不存在此学生信息.\n");
return ;
}
else  							//否则开始查询
{
while(p != NULL)
{
if(p -> num == num)  	//找到学号为num的学生就输出
{
printf("你要查找的学生信息如下:\n");
printf("学号 :%d\n",p -> num);
printf("名字 :%s\n",p -> name);
printf("性别 :%s\n",p -> sex);
printf("年龄 :%d\n",p -> age);
printf("成绩 :%d\n",p -> sroce);
mark = true;
break;
}
else
p = p -> next;
}
}
if(!mark)									//没找到学生与num匹配的学生
{
printf("查询失败.\n");
printf("不存在此学生信息.\n");
return ;
}
printf("查找结束,是否继续查找,按 0 键继续,否者退出.\n");
flag = getch();
fflush(stdin);
}
return ;
}

void Show_Data()								//显示学生信息
{
Node *p;
p = head;
char flag;
while(p != NULL)
{
printf("你要查找的学生信息如下:\n");
printf("学号 :%d\n",p -> num);
printf("名字 :%s\n",p -> name);
printf("性别 :%s\n",p -> sex);
printf("年龄 :%d\n",p -> age);
printf("成绩 :%d\n",p -> sroce);
p = p -> next;
}
printf("输出结束,请按任意键继续.\n");
flag = getch();
fflush(stdin);
return ;
}

void Delete_Data()								//按学号删除学生信息
{
Node *p,*q,*cur;
int num;
char flag = '0';
bool  mark;
while(flag == '0')
{
printf("请输入要删除的学生的学号:  ");
scanf("%d",&num);
fflush(stdin);
mark = false;							//标记是否找到学生
p = q = head;							   //将头结点head赋值与p
if(head == NULL)					   //如果链表中头结点为空,则查询错误
{
printf("删除失败.\n");
printf("不存在此学生信息.\n");
return ;
}
else  							//否则开始查询
{
while(p != NULL)
{
if(p -> num == num)  	//找到学号为num的学生就输出
{
if(head == p)
head = p -> next;
else
q -> next = p -> next;
mark = true;
break;
}
else
{
q = p;
p = p -> next;
}
}
}
if(!mark)									//没找到学生与num匹配的学生
{
printf("删除失败.\n");
printf("不存在学生信息.\n");
return ;
}
printf("删除结束,按 0 键继续,否者退出.\n");
flag = getch();
fflush(stdin);
}
return ;
}

void Update_date()								//修改学生信息
{
Node *p;
int num;
char flag = '0';
bool  mark;
while(flag == '0')
{
printf("请输入要修改的学生的学号:  ");
scanf("%d",&num);
fflush(stdin);
mark = false;							//标记是否找到学生
p = head;							   //将头结点head赋值与p
if(head == NULL)					   //如果链表中头结点为空,则查询错误
{
printf("修改失败.\n");
printf("不存在此学生信息.\n");
return ;
}
else  							//否则开始查询
{
while(p != NULL)
{
if(p -> num == num)  	//找到学号为num的学生就输出
{
printf("请输入姓名:");
scanf("%s",&p -> name);
printf("请输入学号:");
scanf("%d",&p -> num);
printf("请输入年龄 :");
scanf("%d",&p -> age);
printf("请输入性别 :");
scanf("%s",&p -> sex);
printf("请输入成绩 :");
scanf("%d",&p -> sroce);
fflush(stdin);				//用来清空输入缓存,以便不影响后面输入的东西
mark = true;
break;
}
else
p = p -> next;
}
}
if(!mark)									//没找到学生与num匹配的学生
{
printf("修改失败.\n");
printf("不存在此学生信息.\n");
return ;
}
printf("修改结束,按 0 键继续,否者退出.\n");
flag = getch();
fflush(stdin);
}
return ;
}

void Solve_Data() 					 					//将处理后的链表中的信息存进文件
{
FILE *fp;
fp = fopen("Student","w");  					    //以"w"形式打开student文件
while(head != NULL)
{
fwrite(head,sizeof(struct Node),1,fp); 	    //写进student文件
head = head -> next;
}
fclose(fp);
return ;
}

void List()										//菜单选择函数
{
char x;
bool flag = true;
while(flag)
{
Interface();							//菜单函数
x = getch();
system( "cls" );
fflush(stdin);
switch(x)
{
case '1':
Add_Data();
break;
case '2':
Find_Data();
break;
case '3':
Show_Data();
break;
case '4':
Delete_Data();
break;
case '5':
Update_date();
break;
default:
Solve_Data();
flag=false;
break;
}
}
return ;
}

int main()
{
head = Load();
List();
return 0;
}


感想:
其实自己的基础还不怎么扎实,最近帮忙做这个东西也让自己复习了一遍,无论怎么说,好歹我也是ACM的,数据结构可不能忘。写完这个系统,感觉面向过程的程序实在是有点繁琐,可能是自己接触面向对象多了吧 不过C依旧强大。有什么不懂的读友可评论,会及时评论。------Dash
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: