在使用C语言创建学生成绩管理系统时,需要使用链表来进行信息的管理。通常情况下我们可以使用单链表来实现,单链表是一种链式存储的数据结构。链表中的数据是以节点来表示的。每个节点均包含两部分内容,数据和指向下一节点的指针。在创建链表是应进行动态内存申请,使用malloc函数获取。插入时我们选择头插法来保存数据。下边内容为代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
/*创建学生信息结构体*/
typedef struct _Student
{
char cName[20]; //姓名
int iNum; //学号
float fScore[3]; //学生 语文 数学 英语成绩
}Student;
/*创建车厢*/
typedef struct _Node
{
Student stu; //数据部分
struct _Node* pNext; //指向下一节点的指针
}Node;
/*链表的创建*/
Node* pHead = NULL; //头结点初始化
void in()
{
Node* pNewNode = (Node*)malloc(sizeof(Node)); //创建新节点
pNewNode->pNext = NULL;
/*采用头插法连接链表内容*/
/*判断是否为头结点*/
if (pHead == NULL)
{
pHead = pNewNode; //若为头结点,则新节点指向头结点
}
else
{
pNewNode->pNext = pHead; //新节点的下一节点指针指向头节点
pHead = pNewNode; //新节点成为头结点
}
printf("请输入学生姓名 学号 语文成绩 数学成绩 英语成绩.\n");
scanf("%s %d %f %f %f", pNewNode->stu.cName, &pNewNode->stu.iNum, &pNewNode->stu.fScore[0], &pNewNode->stu.fScore[1], &pNewNode->stu.fScore[2]);
printf("输入数据成功\n");
}
void Delete()
{
int inum;
printf("请输入要删除学生的学号:");
scanf("%d",&inum);
Node* p = pHead; //定义指向头节点的指针
Node* p1, * p2;
/*当要删除信息为头结点时*/
if (pHead->stu.iNum == inum)
{
p1 = pHead;
pHead = pHead->pNext; //头指针指向
printf("删除成功.\n");
}
/*非头节点时*/
while (p->pNext != NULL) //指针到尾节点时中止
{
if (p->pNext ->stu.iNum== inum)
{
p2 = p->pNext; //利用p2备份指针下一节点的指向
p->pNext = p->pNext->pNext; //然后令当下节点指向下下节点,将下一节点跳过
free(p2);
printf("删除成功.\n");
}
p = p->pNext;
}
if (p->pNext == NULL)
{
printf("未找到想要删除学生信息\n");
}
}
/*显示输入信息*/
void Display()
{
Node* p = pHead; //遍历链表
while (p != NULL)
{
printf("\t*姓名:%s*\t*学号:%d*\t*语文成绩:%.2f*\t*数学成绩:%.2f*\t*英语成绩:%.2f*\t\n", p->stu.cName, p->stu.iNum,p->stu.fScore[0],p->stu.fScore[1], p->stu.fScore[2]);
p = p->pNext;
}
}
main()
{
while (1)
{
printf("\t1.输入学生信息\n\t2.删除学生信息\n\t3.显示学生信息\n\t0.拜拜\n");
char ch = _getch(); //获取一个字符
switch (ch)
{
case '1':
in();
break;
case '2':
Delete();
break;
case '3':
Display();
break;
case '0':
printf("baibai\n");
return 0;
break;
default:
printf("\\error\n");
}
}
}
下边为效果展示