疫苗管理系统(C+链表)

这个是继上一个学生管理系统之后的疫苗管理系统,在这个里面我将起代码分开来写,更清晰明了
我还是按照顺序来写,不过会分成很多个区域来写
首先是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);
}

其实你会发现这两个管理系统是相同的,最大的不同也就是输入输出的内容是不同的,除此之外,在也就没有什么是不同的了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值