#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _STU
{
char arrStuNum[10];
char arrStuName[10];
int iStuScore;
struct _STU* pNext;
} STUNODE;
STUNODE* g_pHead = NULL;
STUNODE* g_pEnd = NULL;
void AddStuMSG(char arrStuNum[10], char arrStuName[10], int iStuScore);
void AddStuMSGToLinkHead(char arrStuNum[10], char arrStuName[10], int iStuScore);
void FreeLinkData();
void ShowStuData();
void ShowOrder();
void InsertNode(STUNODE* pTemp, char arrStuNum[10], char arrStuName[10], int iStuScore);
STUNODE* FindStuByNum(char* arrStuNum);
void DeleteStuNode(STUNODE* pNode);
void SaveStuToFile();
void ReadStuFromFile();
int main(void)
{
int nOrder = -1;
char arrStuNum[10] = {'\0'};
char arrStuName[10] = {'\0'};
int iStuScore = -1;
int nFlag = 1;
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");
ReadStuFromFile();
while (nFlag)
{
printf("请输入指令(10查看指令):\n");
scanf("%d", &nOrder);
switch (nOrder)
{
case 1:
printf("输入学生的学号\n");
scanf("%s", arrStuNum);
printf("输入学生的姓名\n");
scanf("%s", arrStuName);
printf("输入学生的分数\n");
scanf("%d", &iStuScore);
AddStuMSG(arrStuNum, arrStuName, iStuScore);
break;
case 11:
printf("输入学生的学号\n");
scanf("%s", arrStuNum);
printf("输入学生的姓名\n");
scanf("%s", arrStuName);
printf("输入学生的分数\n");
scanf("%d", &iStuScore);
AddStuMSGToLinkHead(arrStuNum, arrStuName, iStuScore);
break;
case 111:
printf("输入指定学号\n");
scanf("%s", arrStuNum);
STUNODE* pTemp;
pTemp = FindStuByNum(arrStuNum);
if (NULL != pTemp) {
printf("输入学生的学号\n");
scanf("%s", arrStuNum);
printf("输入学生的姓名\n");
scanf("%s", arrStuName);
printf("输入学生的分数\n");
scanf("%d", &iStuScore);
InsertNode(pTemp, arrStuNum, arrStuName, iStuScore);
}
break;
case 2:
printf("输入指定学号\n");
scanf("%s", arrStuNum);
pTemp = FindStuByNum(arrStuNum);
if (NULL != pTemp) {
printf("学号:%s, 姓名:%s, 分数:%d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);
}
break;
case 3:
printf("输入指定学号\n");
scanf("%s", arrStuNum);
pTemp = FindStuByNum(arrStuNum);
if (NULL != pTemp) {
printf("请输入学号\n");
scanf("%s", arrStuNum);
strcpy(pTemp->arrStuNum, arrStuNum);
printf("请输入姓名\n");
scanf("%s", arrStuName);
strcpy(pTemp->arrStuName, arrStuName);
printf("请输入分数\n");
scanf("%d", &iStuScore);
pTemp->iStuScore = iStuScore;
}
break;
case 4:
SaveStuToFile();
break;
case 6:
printf("输入要删除的学生的学号\n");
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("not right\n");
}
}
SaveStuToFile();
FreeLinkData();
return 0;
}
void AddStuMSG(char arrStuNum[10], char arrStuName[10], int iStuScore)
{
STUNODE* pTemp = (STUNODE*)malloc (sizeof (STUNODE));
if (NULL == arrStuNum || NULL == arrStuName || iStuScore < 0) {
printf("学生信息输入错误!\n");
return;
}
strcpy(pTemp->arrStuNum, arrStuNum);
strcpy(pTemp->arrStuName, arrStuName);
pTemp->iStuScore = iStuScore;
pTemp->pNext = NULL;
if (NULL == g_pHead || NULL == g_pEnd) {
g_pHead = pTemp;
} else {
g_pEnd->pNext = pTemp;
}
g_pEnd = pTemp;
}
void FreeLinkData()
{
STUNODE* pTemp = g_pHead;
while (g_pHead != NULL) {
pTemp = g_pHead;
g_pHead = g_pHead->pNext;
free(pTemp);
}
}
void ShowStuData()
{
STUNODE* pTemp = g_pHead;
while (NULL != pTemp)
{
printf("学号:%s, 姓名:%s, 分数:%d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);
pTemp = pTemp->pNext;
}
}
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");
}
void AddStuMSGToLinkHead(char arrStuNum[10], char arrStuName[10], int iStuScore)
{
STUNODE* pTemp = (STUNODE*)malloc(sizeof(STUNODE));
if (NULL == arrStuNum || NULL == arrStuName || iStuScore < 0)
{
printf("学生信息输入错误!\n");
return;
}
strcpy(pTemp->arrStuNum, arrStuNum);
strcpy(pTemp->arrStuName, arrStuName);
pTemp->iStuScore = iStuScore;
pTemp->pNext = NULL;
if (NULL == g_pHead || NULL == g_pEnd) {
g_pEnd = pTemp;
} else {
pTemp->pNext = g_pHead;
}
g_pHead = pTemp;
}
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 (NULL != pTemp) {
if (0 == strcmp(pTemp->arrStuNum, arrStuNum)) {
return pTemp;
}
pTemp = pTemp->pNext;
}
printf("查无此节点!\n");
return NULL;
}
void InsertNode(STUNODE* pTemp, char arrStuNum[10], char arrStuName[10], int iStuScore)
{
STUNODE* pNewTemp = (STUNODE*)malloc(sizeof(STUNODE));
strcpy(pNewTemp->arrStuNum, arrStuNum);
strcpy(pNewTemp->arrStuName, arrStuName);
pNewTemp->iStuScore = iStuScore;
pNewTemp->pNext = NULL;
if (pTemp == g_pEnd) {
g_pEnd->pNext = pNewTemp;
g_pEnd = pNewTemp;
} else {
pNewTemp->pNext = pTemp->pNext;
pTemp->pNext = pNewTemp;
}
}
void DeleteStuNode(STUNODE* pNode)
{
if (g_pHead == g_pEnd) {
free(g_pHead);
g_pHead = NULL;
g_pEnd = NULL;
return;
}
if (g_pHead == pNode) {
free(g_pHead);
g_pHead = g_pHead->pNext;
return;
}
STUNODE* pTemp = g_pHead;
if (g_pEnd == pNode) {
while (pTemp->pNext != pNode) {
pTemp = pTemp->pNext;
}
pTemp->pNext = NULL;
g_pEnd = pTemp;
free(pNode);
return;
}
if (pNode != g_pHead && pNode != g_pEnd && g_pHead != g_pEnd) {
while (pTemp->pNext != pNode) {
pTemp = pTemp->pNext;
}
pTemp->pNext = pNode->pNext;
free(pNode);
return;
}
}
void SaveStuToFile()
{
FILE* pFile = NULL;
STUNODE* pTemp = g_pHead;
char strBuf[30] = {0};
char strScore[10] = {0};
if (g_pHead == NULL) {
printf("没有学生\n");
return;
}
pFile = fopen("dat.dat", "wb+");
if (NULL == pFile) {
printf("文件打开失败!\n");
return;
}
while (NULL != pTemp) {
strcpy(strBuf, pTemp->arrStuNum);
strcat(strBuf, ".");
strcat(strBuf, pTemp->arrStuName);
strcat(strBuf, ".");
snprintf(strScore, 10, "%d", pTemp->iStuScore);
strcat(strBuf, strScore);
fwrite(strBuf, 1, strlen(strBuf), pFile);
fwrite("\r\n", 1, strlen("\r\n"), pFile);
pTemp = pTemp->pNext;
}
fclose(pFile);
}
void ReadStuFromFile()
{
FILE* pFile = fopen("dat.dat", "rb+");
char strBuf[30] = {0};
char strStuNum[10] = {0};
char strStuName[10] = {0};
char strStuScore[10] = {0};
int nCount = 0;
int iStuScore;
if (NULL == pFile) {
printf("文件打开失败\n");
return;
}
while (NULL != fgets(strBuf, 30, pFile)) {
int i = 0;
int j = 0;
int nCount = 0;
for (i = 0; strBuf[i] != '\r'; i++) {
if (0 == nCount) {
strStuNum[i] = strBuf[i];
if ('.' == strBuf[i]) {
strStuNum[i] = '\0';
nCount++;
}
} else if (1 == nCount) {
if ('.' != strBuf[i]) {
strStuName[j] = strBuf[i];
j++;
}
if ('.' == strBuf[i]) {
strStuName[j] = '\0';
nCount++;
j = 0;
}
} else {
strStuScore[j] = strBuf[i];
j++;
}
}
iStuScore = strtol(strStuScore, NULL, 10);
AddStuMSG(strStuNum, strStuName, iStuScore);
}
fclose(pFile);
}