#define _CRT_SECURE_NO_WARNINGS // 对编译器操作 scanf scanf_s
#include "singleList.h"
struct Node* list = NULL;
void systemMenu()
{
printf("-------------【学生管理系统】--------\n");
printf("\t\t0.退出系统\n");
printf("\t\t1.插入信息\n");
printf("\t\t2.浏览信息\n");
printf("\t\t3.删除信息\n");
printf("\t\t4.修改信息\n");
printf("\t\t5.查询信息\n");
printf("------------------------------------\n");
printf("请输入(0~5)\n");
}
// 处理用户交互
void keyDown()
{
int userKey;
struct student tempData;
scanf("%d", &userKey);
switch (userKey)
{
case 0:
printf("\t\t【退出系统】\n");
exit(0);
break;
case 1:
printf("\t\t【插入信息】\n");
printf("请输入姓名、学号、年龄、电话、住址:");
scanf("%s%s%d%s%s", tempData.name, tempData.num, &tempData.age, tempData.tel, tempData.addr);
insterNodeByHead(list, tempData);
saveInforToFile("student.txt", list);
break;
case 2:
printf("\t\t【浏览信息】\n");
printList(list);
break;
case 3:
printf("\t\t【删除信息】\n");
printf("请输入要删除的学生姓名:");
scanf("%s", tempData.name);
deleNodeByAppoinNum(list, tempData.name);
saveInforToFile("student.txt", list);
break;
case 4:
printf("\t\t【修改信息】\n");
printf("请输入要修改的学生的学号:");
scanf("%s", tempData.num);
if (searchNodeByAppoinNum(list, tempData.num) == NULL)
{
printf("未找到相关信息\n");
}
else
{
struct Node* curNode = searchNodeByAppoinNum(list, tempData.num);
printf("请输入新的姓名、学号、年龄、电话、住址:");
scanf("%s%s%d%s%s", curNode->data.name, curNode->data.num, &curNode->data.age, curNode->data.tel, curNode->data.addr);
saveInforToFile("student.txt", list);
}
break;
case 5:
printf("请输入查找的学号:");
scanf("%s", tempData.num);
if (searchNodeByAppoinNum(list, tempData.num) == NULL)
{
printf("未找到相关信息!\n");
}
else {
printNode(searchNodeByAppoinNum(list, tempData.num));
}
break;
default:
printf("输入错误!请重新输入\n");
break;
}
}
int main()
{
list = creatList();
readInforFromFile("student.txt", list);
while (1)
{
systemMenu();
keyDown();
system("pause");//未定义标识符system #include<stdlib.h>
system("cls");// 每次程序运行的时候都会将上一次运行输出的内容给清除掉,屏幕上只显示本次输出的结果
}
return 0;
}
singleList.h
#include<stdlib.h>
#include<stdio.h>
#include<string.h> // strcmp
struct student
{
char name[20];
char num[10];
int age;
char tel[20];
char addr[20];
};
// 写数据结构
struct Node
{
struct student data; // 数据域
struct Node* next; // 指针域
};
struct Node* creatList()
{
// 有表头链表:第一个结点不存储数据
// 无表头链表:第一个结点存储数据
// 指针变成变量 :动态内存申请
// 1. 产生一个结构体变量
struct Node* listHeadNode = (struct Node*)malloc(sizeof(struct Node));// 动态内存申请
/*
malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
*/
// 2. 初始化一个结构体变量
listHeadNode->next = NULL; // 表头
return listHeadNode;
}
// 创建结点
struct Node* creatNode(struct student data)
{
// 有表头链表:第一个结点不存储数据
// 无表头链表:第一个结点存储数据
// 指针变成变量 :动态内存申请
// 1. 产生一个结构体变量
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));// 动态内存申请
// 2. 初始化一个结构体变量
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 插入
// 插入哪个链表(通过表头),插入的数据是多少
void insterNodeByHead(struct Node* listHeadNode, struct student data)
{
struct Node* newNode = creatNode(data);
newNode->next = listHeadNode->next;
listHeadNode->next = newNode;
}
//删除
// free(释放)
void deleNodeByAppoinNum(struct Node* listHeadNode, char *name)
{
struct Node* posFrontNode = listHeadNode;
struct Node* posNode = listHeadNode->next;
if (posNode == NULL)
{
printf("无相关内容,无法删除!\n");
return;
}
else
{
while (strcmp(posNode->data.name,name))
{
posFrontNode = posNode;
posNode = posFrontNode->next;
if (posNode == NULL) // 到尾结点
{
printf("无相关内容,无法删除!\n");
return;
}
}
posFrontNode->next = posNode->next;
free(posNode);// 释放
}
}
// 查询
struct Node* searchNodeByAppoinNum(struct Node* listHeadNode, char *num)
{
struct Node* pMove = listHeadNode->next;
if (pMove == NULL)
return pMove;
else
{
while (strcmp(pMove->data.num,num))
{
pMove = pMove->next;
if (pMove == NULL)
{
break;
}
}
return pMove;
}
}
// 打印结点信息
void printNode(struct Node* curNode)
{
printf("姓名\t学号\t年龄\t电话\t\t住址\n");
printf("%s\t%s\t%d\t%s\t%s\n", curNode->data.name, curNode->data.num, curNode->data.age, curNode->data.tel, curNode->data.addr);
}
// 打印全部信息
void printList(struct Node* listHeadNode)
{
struct Node* pMove = listHeadNode->next;
printf("姓名\t学号\t年龄\t电话\t\t住址\n");
while (pMove)
{
printf("%s\t%s\t%d\t%s\t%s\n", pMove->data.name, pMove->data.num, pMove->data.age, pMove->data.tel, pMove->data.addr);
pMove = pMove->next;
}
printf("\n");
}
void readInforFromFile(char *fileName, struct Node* listHeadNode)
{
FILE *fp = fopen(fileName, "r");// 定义文件指针,打开文件
if (fp == NULL) // 如果文件是空的,以“创建文件” 的方式打开文件
{
fp = fopen(fileName, "w");
}
// 格式化读取
// 定义临时变量,存储读取到的临时信息
struct student tempData;
while (fscanf(fp,"%s\t%s\t%d\t%s\t%s\n", tempData.name, tempData.num,
&tempData.age, tempData.tel, tempData.addr)!=EOF)
{
insterNodeByHead(listHeadNode, tempData);
memset(&tempData, 0, sizeof(tempData));
}
fclose(fp);
}
void saveInforToFile(char *fileName, struct Node* listHeadNode)
{
FILE *fp = fopen(fileName, "w");
struct Node* pMove = listHeadNode->next;
while (pMove)
{
fprintf(fp, "%s\t%s\t%d\t%s\t%s\n", pMove->data.name, pMove->data.num, pMove->data.age, pMove->data.tel, pMove->data.addr);
pMove = pMove->next;
}
fclose(fp);
}