通用管理系统(C语言实现)

功能说明:

本系统是基于链表进行实现的,实现了一些简单的添加、删除、按需查找等功能。代码主要由三部分组成,分别为Stu_System.h、Stu_System.c和用于测试的main.c文件组成。
Stu_System.h

#ifndef __Stu_System
#define __Stu_System
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)
//学生节点
typedef struct _STU
{
	char arrStuNum[10];
	char arrStuName[255];
	int iStuScore;
	struct _STU *Next;
}STUNODE;

//声明链表的头和尾
extern STUNODE* g_pHead;
extern STUNODE* g_pEnd;
//添加一个学生的信息
void AddStuMSG(char *arrStuNum, char arrStuName[10], int iStuScore);

//链表头添加一个节点
void AddStuMSGToLinkHead(char *arrStuNum, char arrStuName[10], int iStuScore);

//清空链表
void FreeLinkData();

//打印数据
void ShowStuData();

//显示指令
void ShowOrder();

//查找指定学生
STUNODE* FindStuByNum(char* arrStuNum);

//指定位置插入节点

void InsertNode(STUNODE* pTemp, char *arrStuNum, char arrStuName[10], int iStuScore);

//删除指定学生
void DeleteStuNode(STUNODE* pNode);

//将信息保存在文件中
void SaveStuToFile();

//读取文件中的学生信息
void ReadStuFromFile();
#endif

Stu_System.c

#include "Stu_System.h"
STUNODE* g_pHead = NULL;
STUNODE* g_pEnd = NULL;
void AddStuMSG(char *arrStuNum, char arrStuName[10], int iStuScore)
{
	STUNODE* pTemp = (STUNODE*)malloc(sizeof(STUNODE));
	if (NULL == arrStuName || NULL == arrStuNum || iStuScore < 0)
	{
		printf("学生信息输入错误!\n");
		return;
	}
	strcpy(pTemp->arrStuName, arrStuName);
	strcpy(pTemp->arrStuNum, arrStuNum);
	pTemp->iStuScore = iStuScore;
	pTemp->Next = NULL;
	if (NULL == g_pHead || NULL == g_pEnd)
	{
		g_pHead = pTemp;
	}
	else
	{
		g_pEnd->Next = pTemp;
	}
	g_pEnd = pTemp;
}

//链表头添加一个节点
void AddStuMSGToLinkHead(char *arrStuNum, char arrStuName[10], int iStuScore)
{
	STUNODE* pTemp = (STUNODE*)malloc(sizeof(STUNODE));
	if (NULL == arrStuName || NULL == arrStuName || iStuScore < 0)
	{
		printf("学生信息输入错误!\n");
		return;
	}
	strcpy(pTemp->arrStuNum, arrStuNum);
	strcpy(pTemp->arrStuName, arrStuName);
	pTemp->iStuScore = iStuScore;
	pTemp->Next = NULL;
	if (NULL == g_pHead || NULL == g_pEnd)
	{
		g_pHead = pTemp;
		g_pEnd = pTemp;
	}
	else
	{
		pTemp->Next = g_pHead;
		g_pHead = pTemp;
	}
}

//清空链表
void FreeLinkData()
{
	STUNODE* pTemp = NULL;
	while (g_pHead != NULL)
	{
		pTemp = g_pHead;
		g_pHead = g_pHead->Next;
		free(pTemp);
		pTemp = NULL;
	}
}

//打印数据
void ShowStuData()
{
	STUNODE* pTemp = g_pHead;
	while (pTemp != NULL)
	{
		printf("学号:%s, 姓名:%s, 分数:%d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);
		pTemp = pTemp->Next;
	}
}

//显示指令
void ShowOrder()
{
	printf("*******************学生信息管理系统*********************\n");
	printf("*******************本系统操作指令如下*******************\n");
	printf("***             1、 增加一个学生信息(尾添加)         ***\n");
	printf("***            11、 增加一个学生信息(头添加)         ***\n");
	printf("***           111、 增加一个学生信息(在指定位置添加) ***\n");
	printf("***             2、 查找指定学生的信息(姓名/学号)  ***\n");
	printf("***             3、 修改指定学生的信息               ***\n");
	printf("***             4、 保存业主的信息到文件中           ***\n");
	printf("***             5、 读取文件中的业主信息             ***\n");
	printf("***             6、 删除指定学生的信息               ***\n");
	printf("***             7、 恢复删除的学生的信息             ***\n");
	printf("***             9、 显示所有学生的信息               ***\n");
	printf("***             0、 退出系统                         ***\n");
	printf("********************************************************\n");
}

//查找指定学生
STUNODE* FindStuByNum(char* arrStuNum)
{
	STUNODE* pTemp = g_pHead;
	if (NULL == arrStuNum)
	{
		printf("学号输入错误!\n");
		return NULL;
	}
	if (NULL == g_pHead || NULL == g_pEnd)
	{
		printf("链表为NULL!\n");
		return NULL;
	}
	while (pTemp != NULL)
	{
		if (0 == strcmp(pTemp->arrStuNum, arrStuNum))
		{
			return pTemp;
		}
		pTemp = pTemp->Next;
	}
	printf("不存在该学生信息!\n");
	return NULL;
}

//指定位置插入节点

void InsertNode(STUNODE* pTemp, char *arrStuNum, char arrStuName[10], int iStuScore)
{
	STUNODE* pNewTemp = (STUNODE*)malloc(sizeof(STUNODE));
	strcpy(pNewTemp->arrStuNum, arrStuNum);
	strcpy(pNewTemp->arrStuName, arrStuName);
	pNewTemp->iStuScore = iStuScore;
	pNewTemp->Next = NULL;
	if (pTemp == g_pEnd)
	{
		g_pEnd->Next = pNewTemp;
		g_pEnd = pNewTemp;
	}
	{
		pNewTemp->Next = pTemp->Next;
		pTemp->Next = pNewTemp;

	}
}

//删除指定学生
void DeleteStuNode(STUNODE* pNode)
{
	if (g_pHead == g_pEnd)
	{
		free(g_pHead);
		g_pEnd = NULL;
		g_pHead = NULL;
	}
	else if (g_pHead->Next = g_pEnd)
	{
		if (g_pHead == pNode)
		{
			free(g_pHead);
			g_pHead = g_pEnd;
		}
		else
		{
			free(g_pEnd);
			g_pEnd = g_pHead;
			g_pHead->Next = NULL;
		}
	}
	else
	{
		STUNODE* pTemp = g_pHead;
		if (g_pHead == pNode)
		{
			pTemp = g_pHead;
			g_pHead = g_pHead->Next;
			free(pTemp);
			pTemp = NULL;
			return;
		}
		while (pTemp)
		{
			if (pTemp->Next == pNode)
			{
				if (pNode == g_pEnd)
				{
					free(pNode);
					pNode = NULL;
					g_pEnd = pTemp;
					g_pEnd->Next = NULL;
					return;
				}
				else
				{
					STUNODE* p = pTemp->Next;
					pTemp->Next = p->Next;
					free(p);
					p = NULL;
					return;
				}
			}
			pTemp = pTemp->Next;
		}
	}
}

//将信息保存在文件中
void SaveStuToFile()
{
	FILE* pFile = NULL;
	STUNODE* pTemp = g_pHead;
	char strBuffer[30] = { 0 };
	char strScore[10];
	char strBuf1[30] = { 0 };
	if (NULL == g_pHead)
	{
		printf("没有学生\n");
		return;
	}
	pFile = fopen("dat.txt", "w+");
	if (NULL == pFile)
	{
		printf("文件打开失败\n");
		return;
	}
	while (pTemp)
	{
		strcpy(strBuffer, pTemp->arrStuNum);
		strcat(strBuffer, ".");
		strcat(strBuffer, pTemp->arrStuName);
		strcat(strBuffer, ".");
		itoa(pTemp->iStuScore, strScore, 10);
		strcat(strBuffer, strScore);
		strcat(strBuffer, "\r\n");
		fwrite(strBuffer, 1, strlen(strBuffer), pFile);//注意sizeof()和strlen的区别,这里如果使用sizeof()则会读取Buffer本身的容量大小
		pTemp = pTemp->Next;
	}
	fclose(pFile);
}
//读取文件中的学生信息
void ReadStuFromFile()
{
	FILE* pFile = fopen("dat.txt", "r+");
	char strBuf[30] = { 0 };
	char *strStuNum = NULL;
	char *strStuName = NULL;
	char *strStuScore = NULL;
	int nCount = 0;
	int j = 0;
	int flag = 0;
	if (NULL == pFile)
	{
		printf("\t文件打开失败,请查看数据库文件是否存在!!!!\n");
		return;
	}
	//while (NULL != fgets(strBuf, sizeof(strBuf), pFile))//这里不能使用strlen否则返回0
	//{
	//	int i = 0;
	//	nCount = 0;
	//	j = 0;
	//	for (i = 0; strBuf[i] != '\r'; i++)
	//	{
	//		if (0 == nCount)
	//		{
	//			strStuNum[i] = strBuf[i];
	//			if (strBuf[i] == '.')
	//			{
	//				strStuNum[i] = '\0';
	//				nCount++;
	//			}
	//		}
	//		else if (nCount == 1)
	//		{
	//			strStuName[j] = strBuf[i];
	//			j++;
	//			if ('.' == strBuf[i])
	//			{
	//				strStuName[j] = '\0';
	//				nCount++;
	//				j = 0;
	//			}
	//		}
	//		else
	//		{
	//			strStuScore[j] = strBuf[i];
	//			j++;
	//		}
	//	}
		//AddStuMSG(strStuNum, strStuName, atoi(strStuScore));
		//flag = 1;
	//}
	while (NULL != fgets(strBuf, sizeof(strBuf), pFile))
	{
		strStuNum = strtok(strBuf, ".");
		strStuName = strtok(NULL, ".");
		strStuScore = strtok(NULL, "\r\n");
		flag = 1;
		AddStuMSG(strStuNum, strStuName, atoi(strStuScore));
	}
	if (flag == 0)
	{
		printf("\t数据库文件中没有存储学生信息!!!\n");
	}
	fclose(pFile);
}

main.c

#include"Stu_System.h"
int main()
{
	int nOrder = -1;
	char arrStuNum[10] = { 0 };
	char arrStuName[10] = { 0 };
	int iStuScore = -1;
	int nFlag = 1;
	STUNODE* pTemp = NULL;
	ShowOrder();
	//ReadStuFromFile();
	while (nFlag)
	{
		printf("请输入指令(10:查看指令目录)");
		scanf("%d", &nOrder);
		switch (nOrder)
		{
		case 1://尾添加---添加一个学生信息
			printf("输入学号:");
			scanf("%s", arrStuNum);
			printf("输入姓名:");
			scanf("%s", arrStuName);
			printf("输入分数:");
			scanf("%d", &iStuScore);
			AddStuMSG(arrStuNum, arrStuName, iStuScore);
			break;
		case 11://尾添加---添加一个学生信息
			printf("输入学号:");
			scanf("%s", arrStuNum);
			printf("输入姓名:");
			scanf("%s", arrStuName);
			printf("输入分数:");
			scanf("%d", &iStuScore);
			AddStuMSGToLinkHead(arrStuNum, arrStuName, iStuScore);
			break;
		case 111://中间添加
			printf("输入指定学号: ");
			scanf("%s", arrStuNum);
			pTemp = FindStuByNum(arrStuNum);
			if (NULL != pTemp)
			{
				printf("输入学号:");
				scanf("%s", arrStuNum);
				printf("输入姓名:");
				scanf("%s", arrStuName);
				printf("输入分数:");
				scanf("%d", &iStuScore);

				InsertNode(pTemp, arrStuNum, arrStuName, iStuScore);
			}
			break;
		case 2://打印指定学生信息
			printf("输入指定学号:");
			scanf("%s", arrStuNum);
			//查找
			pTemp = FindStuByNum(arrStuNum);

			//打印
			if (NULL != pTemp)  
			{
				printf("学号:%s, 姓名:%s, 分数:%d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);
			}
			break;
		case 3://修改指定学生信息
			printf("输入指定学号:");
			scanf("%s", arrStuNum);
			pTemp = FindStuByNum(arrStuNum);
			if (NULL != pTemp)
			{
				printf("输入学号:");
				scanf("%s", arrStuNum);
				strcpy(pTemp->arrStuNum, arrStuNum);
				printf("输入名字:");
				scanf("%s", arrStuName);
				strcpy(pTemp->arrStuName, arrStuName);
				printf("输入分数:");
				scanf("%d", &iStuScore);
				pTemp->iStuScore = iStuScore;
			}
			break;
		case 4://保存学生信息
			SaveStuToFile();
			break;
		case 5:
			ReadStuFromFile();
			break;
		case 6://删除某个学生相关信息
			printf("输入要删除的学生学号:");
			scanf("%s", arrStuNum);
			pTemp = FindStuByNum(arrStuNum);
			if (NULL != pTemp)
			{
				DeleteStuNode(pTemp);
			}
			break;
		case 7://释放链表中所有元素
			FreeLinkData();
			g_pHead = NULL;
			g_pEnd = NULL;
			ReadStuFromFile();
			break;
		case 9://显示链表内容
			ShowStuData();
			break;
		case 10://查看指令
			ShowOrder();
			break;
		case 0:
			nFlag = 0;
			break;
		default:
			printf("输入的指令不正确!\n");
		}
	}
	SaveStuToFile();
	FreeLinkData();
	system("pause");
	return 0;
}

运行结果图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值