单链表做学生信息管理系统
修改前的代码(c语言):
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
//首先把'学生'的数据抽象出来
struct student {
char name[20];
char num[20];
int math;//数学成绩
int english; //英语成绩
int py;//python成绩
int sum;//总分把都加起来。sum=math+english+python;
//所有关于数据的地方都要修改
};
//有头链表先做表头再插入
struct Node {
int data;
struct Node* next;
};//创建结构体
struct Node* list; //需要一个指针存储整个链表
struct Node* createHead() {
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
//用指针表示结点,首先要把指针变为变量,即做动态内存申请
assert(headNode); //断言函数,看他的内存是否申请成功;判断当前指针是否为空,如果为空就会引发断点
headNode->next = NULL;
return headNode;
//创建链表,表头的数据不做初始化(headNode->data=1,表头初始化的个人理解),只初始化指针
}
//创建结点。插入数据之前首先要创建结点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
assert(newNode); //判断newNode内存是否分配成功
newNode->data = 1;
newNode->next = NULL;
return newNode;
}
//插入数据
void insertData(struct Node* headNode,int data)
{
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//打印链表
void printList(struct Node* headNode) //括号里用头结点代表整个链表
{
//有头链表第一个结构体没有数据。第一个指针指向第二个结点
struct Node* pmove = headNode->next;
while (pmove != NULL)
{
printf("%d\t", pmove->data);
pmove = pmove->next; //打印完,pmove走向下一个
}
}
//删除数据
void deleteData(struct Node* headNode, int posData) {
//删除结点,直到其前后结点的名字,将前一个结点连到后一个结点,自己当灯泡
struct Node* preNode = headNode;
struct Node* curNode = headNode->next;
while (curNode != NULL && curNode->data != posData)
{
preNode = curNode;
curNode = preNode->next;//前驱结点走向当前结点,被踢的当前结点走向当前结点的下一个
}
if (curNode == NULL) {
printf("删除失败!没有找到指定数据!\n");
}
else
{
preNode->next = curNode->next;
free(curNode);
}
}
//查找数据
struct Node* searchData(struct Node* headNode,int posData)
{
struct Node* pmove = headNode->next;
while (pmove != NULL && pmoce->data!=posData)
{
pmove = pmove->next; //pmove走向下一个位置
}
return pmove;//返回pmove,继续
}
void makeMenu() {
printf("----------[链式学生信息管理系统]---------");
printf("\n\t\t0.退出功能\n");
printf("\t\t1.录入功能\n");
printf("\t\t2.浏览功能\n");
printf("\t\t3.查找功能\n");
printf("\t\t4.修改功能\n");
printf("\t\t5.删除功能\n");
printf("------------------------");
printf("请输入(0~5):");
}
void keyDown(){
int userkey = 0;
printf("请输入你需要的功能模块:");
scanf_s("%d", &userkey); //char d 20;等同于canf_s("%s",d,20);
switch (userkey)
{
case 0:
printf("-------[退出功能]-------");
system("pause");
exit(0);//用一个地址把整个程序关掉;
break;
case 1:
printf("-------[录入功能]-------");
break;
case 2:
printf("-------[浏览功能]-------");
break;
case 3:
printf("-------[查找功能]-------");
break;
case 4:
printf("-------[修改功能]-------");
break;
case 5:
printf("-------[删除功能]-------");
break;
default:
printf("输入错误!没有该功能、n");
break;
}
}
int main() {
list = createHead(); //初始化
insertData(list,1); //pmove在第一个结点
insertData(list,666); //pmove走向第二个结点
printList(list);
printf("\n");
while(1)
{
makeMenu();
keyDown();
system("pause");
system("cls");
return 0;
}
}