一份非常好的数据结构课程设计:c语言学生管理系统
根据提供的文件信息,我们可以深入分析该学生管理系统的数据结构与实现方法。 ### 数据结构定义 在本系统中,主要的数据结构被定义为`struct scorenode`。为了方便后续的讨论,我们将这一结构体称为`score`类型。其具体定义如下: ```c struct score { int number; /* 学号 */ char name[10]; /* 姓名 */ float yuwen; /* 语文成绩 */ float yingyu; /* 英语成绩 */ float shuxue; /* 数学成绩 */ struct score *next; /* 指向下一个节点的指针 */ }; ``` 这里定义了一个典型的单链表节点结构,其中包含了一些基本的学生信息(如学号、姓名以及三门科目的成绩),以及一个指向下一节点的指针`next`。这种结构非常适合用来存储和管理动态的学生数据集合。 ### 系统功能实现 #### 创建学生信息 在提供的代码片段中,有一个名为`creat2311`的函数用于创建学生信息列表。该函数通过一系列输入来收集学生的信息,并将其添加到链表中。具体实现流程如下: 1. **初始化**:首先初始化一些必要的变量,例如链表头`head`和当前操作的节点`p1`等。 2. **循环读取学生信息**:程序会持续读取学生的学号,直到用户输入0为止。 - 如果输入的学号为负数,则提示重新输入。 - 如果学号为0,则结束循环。 - 如果学号已经存在,则提示并重新输入。 - 如果学号合法,则继续输入该学生的其他信息(姓名、各科成绩)。 3. **验证成绩的合法性**:每输入一个成绩后,程序都会检查其是否在0到100之间,如果不在这个范围内,则提示用户重新输入,直至输入合法的成绩为止。 4. **构建链表**:随着每一个新学生信息的输入,这些信息会被封装成一个新的`score`结构体节点,并通过指针链接到链表中。初始时,`head`为空;当输入第一个学生信息时,`head`指向这个节点;之后的每个节点通过前一个节点的`next`指针连接起来。 5. **结束条件**:当用户输入学号为0时,表示不再有新的学生信息输入,此时程序将跳出循环,并返回链表头`head`。 ### 关键知识点总结 1. **链表的基本概念**:链表是一种常见的线性数据结构,它通过一组节点来存储数据元素,每个节点包含数据域和指向下一个节点的指针域。 2. **单链表的构建**:本系统使用的是单链表,每个节点仅有一个指向下一个节点的指针。单链表的构建通常涉及节点的创建、插入、删除等操作。 3. **输入验证**:在实际应用中,对用户输入进行验证是非常重要的。本系统在输入成绩时进行了有效性检查,确保所有成绩都在合理范围内。 4. **内存分配与释放**:在构建链表的过程中,使用了`malloc`函数动态分配内存。对于单链表,还需要考虑如何释放内存,避免内存泄漏。 5. **链表的操作**:除了创建链表外,还需要掌握如何遍历链表、查找特定节点、修改节点数据等操作。 通过上述分析,可以看出这份C语言学生管理系统的设计不仅体现了基本的数据结构概念,还涵盖了输入验证、动态内存管理等实用技能,是一份非常优秀的学习资料。
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
#include <string.h>
struct scorenode
{int number;/*学号*/
char name[10];/*姓名*/
float yuwen;/*语文成绩*/
float yingyu;/*英语成绩*/
float shuxue;/*数学成绩 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/
/*==============================================================================================*/
score *creat2311(void)
/*函数creat2311,功能:创建链表,此函数带回一个指向链表头的指针*/
{
score*head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3; /*开辟一个新单元*/
printf("请输入学生资料,输0退出!\n");
repeat1: printf("请输入学生学号(学号应大于0):");/*输入学号,学号应大于0*/
scanf("%d",&p1->number);
{getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)
goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("学号重复,请重输!\n");
goto repeat1;
/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入语文成绩(0~100):");/*输入语文成绩,成绩应在0-100*/
scanf("%f",&p1->yuwen);
while(p1->yuwen<0||p1->yuwen>100)
{getchar();
printf("输入错误,请重新输入语文成绩");/*输入错误,重新输入语文成绩直到正确为止*/
scanf("%f",&p1->yuwen);}
剩余28页未读,继续阅读
- 粉丝: 7
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助