功能说明:
本系统是基于链表进行实现的,实现了一些简单的添加、删除、按需查找等功能。代码主要由三部分组成,分别为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;
}
运行结果图: