这个是继上一个学生管理系统之后的疫苗管理系统,在这个里面我将起代码分开来写,更清晰明了
我还是按照顺序来写,不过会分成很多个区域来写
首先是Vaccine System.h
定义链表为空
#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:");
}
按键输入:
void keyDown()
{
int userkey;
struct student tempData;//存储临时的data
scanf("%d",&userkey);
switch(usserkey)
{
case 0:
printf("\t\t【退出系统】\n");
system("pause");
exit(0);
break;
case 1:
printf("\t\t【插入信息】")
printf("请输入姓名,学号,年龄,电话,住址 ,学生所在院系 ,疫苗价格 ,疫苗的批号 ,疫苗厂商 ,接种机构 ,疫苗种类:");//这里自己定义
scanf("%s%s%d%s%s%s%d%s%s%s%s",tempData.name,tempData.num,&tempData.age,tempData.tel,tempData.addr,tempData.department,&tempData.price,tempData.coding,tempData.manufacture,tempData.organization, tempData.type);//这里我都写上
insertNodeByHead(list, tempData);
saveInfoToFile("Vaccine System.txt", list);
break;
case 2:
printf("\t\t【浏览信息】\n");
printList(list);
break;
case 3:
printf("\t\t【删除信息】\n");
printf("请输入要删除学生的姓名:");
scanf("%s", tempData.name);
deleteNodeByAppoinName(list, tempData.name);
saveInfoToFile("Vaccine System.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%s%d%s%s%s%s",tempData.name,tempData.num,&tempData.age,tempData.tel,tempData.addr,tempData.department,&tempData.price,tempData.coding,tempData.manufacture,tempData.organization, tempData.type);
saveInfoToFile("Vaccine System.txt", list);
}
break;
case 5:
printf("\t\t【查找信息】\n");
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 = createList();
readInfoFromFile("Vaccine System.txt", list);
while (1)
{
systemMenu();
keyDown();
system("pause");
system("cls");
}
system("pause");
return 0;
}
在singleList.h中
定义一个结构体用来存放各种信息
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Vaccine
{
char name[20];
char num[10];//学号
int age;
char tel[20];
char addr[20];//家庭住址
char department[10];//学生所在院系
int price;//疫苗价格
char coding[20];//疫苗的批号
char manufacture[20];//疫苗厂商
char organization[10];//接种机构
char type[10];//疫苗种类
};
定义一个结构体用来存放数据和下一个结点的地址
struct Node
{
struct student data;
struct Node* next;
};
创建新的链表
struct Node* createList()
{
struct Node* listHeadNode = (struct Node*)malloc(sizeof(struct Node));
listHeadNode->next = NULL;
return listHeadNode;
}
创建链表的表头
struct Node* createNode(struct student data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
插入结点
void insertNodeByHead(struct Node* listHeadNode, struct student data)
{
//创建插入的结点:
struct Node* newNode = createNode(data);
newNode->next = listHeadNode->next;
listHeadNode->next = newNode;
}
删除结点 根据姓名删除//这些都是可以改动的
void deleteNodeByAppoinName(struct Node* listHeadNode, char* name)
{
struct Node* posFrontNode = listHeadNode;
struct Node* posNode = listHeadNode->next;
if (posNode == NULL)
{
printf("无相关内容,无法删除!!");
return;
}
else
{
while (strcmp(posNode->data.name, name))
{
posFrontNode = posNode;
posNode = posFrontNode->next;
if (posNode == NULL)
{
printf("无相关内容,无法删除!!");
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院系\t价格\t批号\t厂商\t接种机构\t疫苗类型\n");
printf("%s\t%s\t%d\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n", curNode->data.name,curNode->data.num,curNode->data.age,curNode->data.tel,curNode->data.addr,curNode->data.department,curNode->data.price,curNode->data.coding,curNode->data.manufacture,curNode->data.organization,curNode->data.type);
}
打印:就是系统的浏览信息
void printList(struct Node* listHeadNode)//表头打印
{
struct Node* pMove = listHeadNode->next;
printf("姓名\t学号\t年龄\t电话\t\t住址\t院系\t价格\t批号\t厂商\t接种机构\t疫苗类型\n");
while (pMove)
{
printf("%s\t%s\t%d\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.num,pMove->data.age,pMove->data.tel,pMove->data.addr,pMove->data.department,pMove->data.price,pMove->data.coding,pMove->data.manufacture,pMove->data.organization,pMove->data.type);
pMove = pMove->next;
}
printf("\n");
}
文件操作
读取文件
//读的是哪个文件,保存到哪个信息中去
void readInfoFromFile(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\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n", tempData.name,tempData.num,&tempData.age,tempData.tel,tempData.addr, tempData.department,&tempData.price, tempData.coding, tempData.manufacture,tempData.organization,tempData.type)!=EOF)//按照这个格式进行读取文件
//从哪里读的,从文件指针哪里读的,所以最前面是fp
//加\t是以表格的形式进行写,以表格的形式进行读
{
//开始读一个写一个,读一个写一个
//读一个写一个这就相当于插入
insertNodeByHead(listHeadNode,tempData);
memset(&tempData, 0, sizeof(tempData));//开始进行初始化一下
}
fclose(fp);
}
存储文件
void saveInfoToFile(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\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n", data.tel,pMove->data.addr,pMove->data.department,pMove->data.price,pMove->data.coding,pMove->data.manufacture,pMove->data.organization,pMove->data.type);
pMove = pMove->next;
}
fclose(fp);
}
其实你会发现这两个管理系统是相同的,最大的不同也就是输入输出的内容是不同的,除此之外,在也就没有什么是不同的了