/**
* 项目名称:学生信息管理系统(C语言 双向不循环链表)
* 项目功能:学生信息的增删改查(按姓名|学号)、二进制导入导出数据
* 当前版本:2024.03.29.01
* 完成时间:2024年03月29日
* 初始作者:Tianwx [email protected]
* 最后修改:Tianwx
*/
#include "stuinfo_link.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define DatabaseFile "stuinfo.db"
static link_node_t *g_link_head = NULL;
static link_node_t *g_link_tail = NULL;
static int g_count = 0;
int printMenu()
{
int chioce;
printf("\n\n*******************************\n");
printf("*\t1、显示所有学生信息\n");
printf("*\t2、添加学生信息\n");
printf("*\t3、删除学生信息\n");
printf("*\t4、更新学生信息\n");
printf("*\t5、查找学生信息\n");
printf("*\t6、清空所有学生信息\n");
printf("*\t7、退出学生信息系统\n");
printf("*******************************\n");
printf("请输入你的选择:");
scanf("%d", &chioce);
if (chioce < PrtAllInfo || chioce > Quit)
{
printf("请输入正确的选项\n");
printMenu();
}
doChoose(chioce);
}
void doChoose(int n)
{
switch(n)
{
case PrtAllInfo: printAllInfo(); break;
case AddStuInfo: addInfo(); break;
case DelStuInfo: delInfo(); break;
case UpdStuInfo: updInfo(); break;
case FindStuInfo: findInfo(); break;
case ClearStuInfo: clearInfo(); break;
case Quit: quitSysterm(); break;
default: break;
}
}
void printAllInfo()
{
if (!g_link_head || !g_count)
{
printf("提示:当前系统中学生信息为空.\n");
return;
}
for (link_node_t *ptmp = g_link_head; ptmp; ptmp=ptmp->pNext)
{
printf("%d\t%s\t%s\t%d\t%d\t%s\n",
ptmp->data.no,
ptmp->data.name,
ptmp->data.sex,
ptmp->data.age,
ptmp->data.phone,
ptmp->data.addr );
}
printf("共展示 %d 名学生的个人信息\n", g_count);
}
void addInfo()
{
info_t info;
memset(&info, 0, sizeof(info_t));
INPUT:
printf("请输入学号:");
scanf("%d", &info.no);
for (link_node_t *ptmp = g_link_head; ptmp; ptmp=ptmp->pNext)
{
if (ptmp->data.no == info.no)
{
printf("该学号已存在,请重新输入!\n");
goto INPUT;
}
}
printf("请输入学生姓名:");
scanf("%s", info.name);
printf("请输入学生性别:");
scanf("%s", info.sex);
printf("请输入学生年龄:");
scanf("%d", &info.age);
printf("请输入学生联系方式:");
scanf("%d", &info.phone);
printf("请输入学生家庭地址:");
scanf("\n%[^\n]", info.addr);
insertNodeToTail(&info);
g_count += 1;
printf("学生信息添加完成:\n");
printf("%d\t%s\t%s\t%d\t%d\t%s\n",
g_link_tail->data.no,
g_link_tail->data.name,
g_link_tail->data.sex,
g_link_tail->data.age,
g_link_tail->data.phone,
g_link_tail->data.addr );
}
void delInfo()
{
int chioce, no;
link_node_t *target = NULL;
printf("1、根据学号删除学生信息\n");
printf("2、根据姓名删除学生信息\n");
printf("请选择删除方式:");
scanf("%d", &chioce);
if (chioce != 1 && chioce != 2)
{
printf("输入有误,请重新输入\n");
delInfo();
}
// 按学号删除学生信息,信息唯一
if (chioce == 1)
{
printf("请输入要删除的学号:");
scanf("%d", &no);
printf("查询结果如下:\n");
for (link_node_t *ptmp = g_link_head; ptmp; ptmp=ptmp->pNext)
{
if (no == ptmp->data.no)
{
target = ptmp;
printf("%d\t%s\t%s\t%d\t%d\t%s\n",
target->data.no,
target->data.name,
target->data.sex,
target->data.age,
target->data.phone,
target->data.addr );
break;
}
}
if (target == NULL)
{
printf("未查找到学号 %d\n", no);
return;
}
printf("确定删除?(yes or no):");
char s[5] = {0};
scanf("%s", s);
if (!strcmp(s, "yes"))
{
removeNodeFromLink(target);
printf("已删除\n");
}
return;
}
// 按姓名删除学生信息,信息不唯一
char iName[64] = {0};
char sNo[128] = {0};
link_node_t *qTargets[MAX_STUDENT_NUM/10] = {0};
printf("请输入学生姓名:");
scanf("%s", iName);
printf("查询结果如下:\n");
target = NULL;
link_node_t *ptmp = g_link_head;
for (no=1; ptmp; ptmp=ptmp->pNext)
{
if (strcmp(iName, ptmp->data.name) != 0)
continue;
target = ptmp;
qTargets[no] = target;
printf("%d、\t%d\t%s\t%s\t%d\t%d\t%s\n",
no++,
ptmp->data.no,
ptmp->data.name,
ptmp->data.sex,
ptmp->data.age,
ptmp->data.phone,
ptmp->data.addr );
}
if (target == NULL)
{
printf("未查找到姓名 %s\n", iName);
return;
}
printf("请输入要删除信息的序号(使用空格分隔):");
scanf("\n%[^\n]", sNo);
for (int i=0,sum=0; i<=strlen(sNo); i++)
{
if ((isspace(sNo[i]) || !sNo[i]) && sum > 0)
{
if (sum >= no)
{
printf("输入选项 %d 有误,跳过!\n", sum);
sum = 0;
continue;
}
target = qTargets[sum];
if (strcmp(target->data.name, iName) == 0)
{
printf("删除\t%d\t%s\t%s\t%d\t%d\t%s\n",
target->data.no,
target->data.name,
target->data.sex,
target->data.age,
target->data.phone,
target->data.addr );
removeNodeFromLink(target);
}
sum = 0;
continue;
}
if (isdigit(sNo[i]))
sum = sum*10 + sNo[i] - '0';
}
}
void updInfo()
{
int chioce, no, index=-1;
link_node_t *target = NULL;
printf("1、根据学号更新学生信息\n");
printf("2、根据姓名更新学生信息\n");
printf("请选择更新方式:");
scanf("%d", &chioce);
if (chioce != 1 && chioce != 2)
{
printf("输入有误,请重新输入\n");
updInfo();
}
// 按学号更新学生信息
if (chioce == 1)
{
printf("请输入要更新的学号:");
scanf("%d", &no);
printf("查询结果如下:\n");
for (link_node_t *ptmp = g_link_head; ptmp; ptmp=ptmp->pNext)
{
if (no == ptmp->data.no)
{
target = ptmp;
printf("%d\t%s\t%s\t%d\t%d\t%s\n",
ptmp->data.no,
ptmp->data.name,
ptmp->data.sex,
ptmp->data.age,
ptmp->data.phone,
ptmp->data.addr );
break;
}
}
if (target == NULL)
{
printf("未查找到学号 %d\n", no);
return;
}
printf("确定更新?(yes or no):");
char s[16] = {0};
scanf("%s", s);
if (!strcmp(s, "yes"))
{
info_t info;
memset(&info, 0, sizeof(info_t));
info.no = target->data.no;
printf("请输入学生姓名:");
scanf("%s", info.name);
printf("请输入学生性别:");
scanf("%s", info.sex);
printf("请输入学生年龄:");
scanf("%d", &info.age);
printf("请输入学生联系方式:");
scanf("%d", &info.phone);
printf("请输入学生家庭地址:");
scanf("\n%[^\n]", info.addr);
printf("新信息如下:\n");
printf("%d\t%s\t%s\t%d\t%d\t%s\n",
info.no, info.name, info.sex, info.age, info.phone, info.addr );
printf("确定更新?(yes or no):");
memset(s, 0, sizeof(s));
scanf("%s", s);
if (!strcmp(s, "yes"))
{
updateNodeFromLink(target, &info);
printf("更新完成\n");
}
}
return;
}
// 按姓名更新学生信息
char iName[64] = {0};
int iNo;
link_node_t *qTargets[MAX_STUDENT_NUM/10] = {0};
printf("请输入学生姓名:");
scanf("%s", iName);
printf("查询结果如下:\n");
link_node_t *ptmp = g_link_head;
for (int no=1; ptmp; ptmp=ptmp->pNext)
{
if (strcmp(iName, ptmp->data.name) != 0)
continue;
target = ptmp;
qTargets[no] = target;
printf("%d、\t%d\t%s\t%s\t%d\t%d\t%s\n",
no++,
target->data.no,
target->data