学生管理系统(C语言“链表”)@[TOC](这
- 显示页面
- 功能设计
- 主函数
- 链表
显示界面
void menu()
{
printf("--------------[学生信息管理系统]----------------\n");
printf("\t\t1.录入信息\n");
printf("\t\t2.浏览信息\n");
printf("\t\t3.修改信息\n");
printf("\t\t4.删除信息\n");
printf("\t\t5.查找信息\n");
printf("\t\t6.退出系统\n");
printf("-------------------------------------------------\n");
}
功能设计
void keyDown()
{
int choice =0;
struct student data;
struct Node* pMove = NULL;
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("--------------[录入信息]----------------\n");
printf("请输入学生姓名,年龄,性别,电话:");
fflush(stdin);//清空缓存区
scanf("%s%d%s%s",data.name,&data.age,data.sex,data.tel);
insertNodeByHead(list,data);//插入列表
break;
case 2:
printf("--------------[浏览信息]----------------\n");
printList(list);//打印列表
break;
case 3:
printf("--------------[修改信息]----------------\n");
break;
case 4:
printf("--------------[删除信息]----------------\n");
printf("请输入你要删除的学生姓名:");
scanf("%s",data.name);
deleteAppoinNode(list,data.name);
break;
case 5:
printf("--------------[查找信息]----------------\n");
printf("请输入你要查找学生的姓名:");
scanf("%s",data.name);
pMove = searchInfoByDate(list,data.name);
if(pMove==NULL)
{
printf("未找到相关信息,无法删除\n");
system("pause");
}
else
{
printf("%s\t%d\t%s\t%s\n");
printf("%s\t%d\t%s\t%s\n",pMove->data.name,pMove->data.age,pMove->data.sex,pMove->data.tel);
}
break;
case 6:
printf("正常退出\n");
system("pause");
exit(0);
break;
default:
printf("----------[输入错误,重新输入]------------");
system("pause");
break;
}
writeInfoToFile(list,"1.txt");
}
主函数
int main (void)
{
readInfoFromFile(list,"1.txt");
while(1)
{
menu();
keyDown();
system("pause");//防止闪屏
system("cls");//清屏
}
system("pause");
return 0;
}
链表(附录)
struct student
{
char name[20];
int age;
char sex[5];
char tel[20];
};
//结构分结构去写
//某一数据结构去实现相应的功能时,单独去设计此数据结构
struct Node//链表
{
//int date;
struct student date;
struct Node* next;
};
struct Node* createList()//创建一个链表
{
//结构体变量表示表头
//指针--->变量 动态内存申请
struct Node* headNode=(struct Node*)malloc(sizeof(struct Node));//指针变成结构体变量,申请动态内存
headNode->next=NULL;//表头差异化处理 (数据域date不做初始化)
return headNode;
}
struct Node* createNode(struct student date)//创建节点
{
struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
newNode->date=date;
newNode->next=NULL;
return newNode;
}
//插入节点
void insertNodeByHead(struct Node* headNode,struct student date)//插入的链表是以headNode为头的链表,插入的数据为date
{
struct Node* newNode = createNode(date);//第一:创建插入的节点,调用创建节点的子函数
//表头法插入
newNode->next = headNode->next;
headNode->next=newNode;
}
//删除指定位置的节点
void deleteAppoinNode(struct Node* headNode,char *name)
{
struct Node* posNode =headNode->next;//指定位置
struct Node* posFrontNode = headNode;//指定位置的前面
if(posNode==NULL)
{
printf("数据为空,无法删除\n");
return;
}
//姓名是字符串,字符串的比较:strcpm
while(strcmp(posNode->date.name,name))
{
posFrontNode = posNode;
posNode = posFrontNode->next;
if(posNode==NULL)
{
printf("未找到指定位置,无法删除\n");
return;
}
posFrontNode->next = posNode->next;
free(posNode);
}
}
//查找功能
struct Node* searchInfoByDate(struct Node* headNode,char *name)
{
struct Node* pMove=headNode->next;
if(pMove == NULL)
{
return NULL;
}
while(strcmp(pMove->date.name,name))
{
pMove=pMove->next;
}
return pMove;
}
//链表的存储
//文件的读操作
void readInfoFromFile(struct Node* headNode,char *fileName)
{
//1.打开文件
FILE *fp;
struct student data;
if(fp==NULL)
{
fp=fopen(fileName,"w+");
}
fp = fopen(fileName,"r");
//2.读文件
while(fscanf(fp,"%s\t%d\t%s\t%s\n",data.name,data.age,data.sex,data.tel) != EOF)
{
insertNodeByHead(headNode,data);
}
//3.关闭文件
fclose(fp);
}
//文件的写操作
void writeInfoToFile(struct Node* headNode,char *fileName)
{
FILE *fp;
fp = fopen(fileName,"w");
if(fp==NULL)
{
printf("文件打开失败");
return;
}
struct Node* pMove = headNode->next;
while(pMove)
{
fprintf(fp,"%s\t%d\t%s\t%s\n",pMove->date.name,pMove->date.age,pMove->date.sex,pMove->date.tel);
pMove=pMove->next;
}
fclose(fp);
}
//打印链表
void printList(struct Node* headNode)
{
struct Node* pMove=headNode->next;
//涉及到数据的处理
printf("姓名\t年龄\t性别\t电话\n");
while(pMove)
{
printf("%s\t%d\t%s\t%s\n",pMove->date.name,pMove->date.age,pMove->date.sex,pMove->date.tel);
pMove = pMove->next;
}
printf("\n");