双链表实现学生成绩管理系统
学生和班级结构体初始化
学生:
struct Student
{
int math; // 数学
int chinese; // 语文
int english; // 英语
int StudentID; // 记录学生ID
int sum; // 记录总分
struct Student *next; // 学生链表节点
};
班级:
struct Class
{
int classroom; // 教室号
struct Student *Bhead; // 用于指向同个班级不同学生
struct Class *next; // 班级链表节点
};
学生链表创建(这里以尾插法为例子!):
struct Student *studentlink(struct Student *head,int studentnumber)
{
struct Student *new; // 创建链表节点
struct Student *p = head; // 拿到学生链表头节点
int i;
for(i=1;i<=studentnumber;i++)
{
// 开辟节点空间
new = (struct Student *)malloc(sizeof(struct Student));
new->StudentID = i;
// 判断是否是第一个节点,也就是头节点
if(p == NULL)
{
p = new;
head = p;
}
else
{
// 尾插法
while( p->next != NULL)
{
p = p->next; // 让next指针到尾部指向NULL
}
p->next = new; // 让尾部节点作为头节点
}
}
return head; // 返回头节点
}
班级链表创建:
struct Class *classlink(struct Class *head,int classnumber,int studentnumber)
{
struct Class *p = head;
struct Student *student;
struct Class *new;
int j;
for(j=1;j<=classnumber;j++)
{
// 每个班级里头个一名学生完成后要重新初始化链表
student = NULL;
// 开辟空间
new = (struct Class*)malloc(sizeof(struct Class));
new->classroom = j;
// 创建这个学生的链表记录成绩
student = studentlink(student,studentnumber);
new->Bhead = student; // 指向这个班级下一个学生的链表
if( p == NULL) // 判断是否为头节点
{
p = new;
head = p;
}
else
{
// 尾插法
while(p->next != NULL)
{
p = p->next;
}
p->next = new; // 将尾部节点当做头节点开始录成绩
}
}
return head;
}
输入数据到链表中:
struct Class *InPutData(struct Class *head)
{
struct Student *p = NULL; // 学生链表
struct Class *q = head; // 班级链表
while( q != NULL) // 开始扫描班级链表
{
p = q->