昨晚晚修心血来潮,想到自己很久没碰过技术了,一鼓作气写个单链表的学生管理系统
(之前都没搞过,卡在心里不太舒服)
接下来就要研究下文件操作(写入,读取,修改等等)
因为英语太烂,单词很多都没表达清楚
有时间的话,还能搞个SQL去操作下
不过我不知道我还能有多少时间弄下C(大一太忙了)
第一篇是个推箱子,之前误删了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//主要是字符串操作用的
#include<malloc.h>
#include<Windows.h>//这里主要是清屏用的
typedef struct student//偷个懒,用typedef了
{
int study_number;
char name[20];
struct student *next;
}Node;
Node*CreateHeadNode()//头节点
{
Node*HeadNode = (Node*)malloc(sizeof(Node));
HeadNode->next = NULL;
return HeadNode;
}
void InsertNewNode(int s_number, char name[], Node*HeadNode)//插入节点,这里用的是尾插法,输出更好看
{
Node*NewNode = (Node*)malloc(sizeof(Node));
Node*pMove = HeadNode;
NewNode->study_number = s_number;
NewNode->next = NULL;
strcpy(NewNode->name, name);
while (pMove)
{
if (pMove->next == NULL)
{
pMove->next = NewNode;
return;
}
pMove = pMove->next;
}
}
void PrintList(Node*HeadNode)//打印节点(遍历链表)
{
Node*pMove = HeadNode->next;
system("cls");
int n = 1;
while (pMove)
{
printf("----------------\n");
printf("第%d位学生\n学号:%d\n姓名:%s\n", n, pMove->study_number, pMove->name);
printf("----------------\n");
pMove = pMove->next;
n++;
}
}
void DelNode(Node*HeadNode)//删除节点(加入了文字提示,有dos的感觉了)
{
//system("cls");
int FoundData=0;
Node*pMove = HeadNode;
Node*LastpMove = HeadNode->next;
printf("----------------\n");
printf("\n确认打开删除程序输入y\n");
char keys = getchar();
if (keys == 'y')
{
printf("请输入要删除的学号\n");
scanf("%d", &FoundData);
while (LastpMove)
{
if (LastpMove->study_number != FoundData)
{
LastpMove = LastpMove->next;
pMove = pMove->next;
}
else
{
printf("----------------\n");
printf("已删除学号:%d\n名字:%s\n",LastpMove->study_number,LastpMove->name);
pMove->next = LastpMove->next;
free(LastpMove);
return;
}
}
printf("找不到学号:%d的学生\n",FoundData);
}
else
system("cls");
return;
}
void InsertNewNodeByOper(Node*HeadNode)//这只是文字提示,然后调用插入节点
{
//system("cls");
printf("----------------\n");
printf("请输入学号:\n");
int number =0;
scanf("%d", &number);
printf("请输入姓名:\n");
char name[20] = "";
scanf("%s", &name);
printf("----------------\n");
InsertNewNode(number,name, HeadNode);
}
void MyMiniSQL(Node*HeadNode)//初始化链表,下一步就可以搞下文件操作,写到一个excel或txt中来储存
{
int number[9] = { 88,44,666,22,456,321,84,987,123 };
char name[9][20] = { "卧槽","啊这","牛逼","淦","不是吧","又要早读","还有晚修","不想上英语课","他妈的" };
for (int i = 0; i < 9; i++)
InsertNewNode(number[i], name[i], HeadNode);
}
void Interactive(Node*HeadNode)//小小的交互界面,有点dos的感觉,这个很骚的strcmp是百度回来的,有空研究下用switch
{
while (1)
{
printf("----------------\n");
printf("end \ del \ add \ print\n");
char keys[] = "";
gets(keys);
if (!strcmp(keys, "end"))
break;
else if (!strcmp(keys, "del"))
DelNode(HeadNode);
else if (!strcmp(keys, "add"))
InsertNewNodeByOper(HeadNode);
else if(!strcmp(keys,"print"))
PrintList(HeadNode);
}
exit(0);
}
int main()
{
Node*List = CreateHeadNode();//头节点
MyMiniSQL(List);
Interactive(List);
return 0;
}