使用链表完成简易的学生管理系统
无非就是增删改查 用时半天,写了一个简易版
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void show(void);
typedef struct student
{
int m_id;
char m_name[64];
double m_chinese;
double m_math;
double m_english;
struct student * next;
}STU;
STU * head = NULL;
STU * insert_link(STU * head,STU tmp);
void printf_link(STU * head);
void find_link(STU * head,int id);
STU * delete_link(STU * head,int id);
void change_link(STU * head,int id);
int main(int argc, char *argv[])
{
show();
while(1)
{
char chose[64]="";
fgets(chose,sizeof(chose),stdin);
chose[strlen(chose)-1] = '\0';
printf("您的选择为:%s\n",chose);
if(strcmp("add",chose)==0)
{
printf("增加\n");
STU tmp;
printf("请输入添加的学生的id\n");
scanf("%d",&tmp.m_id);
printf("请输入添加的学生的姓名\n");
scanf("%s",tmp.m_name);
printf("请输入添加的学生的语文成绩\n");
scanf("%lf",&tmp.m_chinese);
printf("请输入添加的学生的数学成绩\n");
scanf("%lf",&tmp.m_math);
printf("请输入添加的学生的英语成绩\n");
scanf("%lf",&tmp.m_english);
getchar();
head = insert_link(head,tmp);
continue;
}
else if(strcmp("delete",chose)==0)
{
int id=0;
printf("请输入要删除的ID\n");
scanf("%d",&id);
head = delete_link(head,id);
}
else if(strcmp("change",chose)==0)
{
int id;
printf("请输入要修改的id为:");
scanf("%d",&id);
change_link(head,id);
}
else if(strcmp("find",chose)==0)
{
int id;
printf("请输入要查找的ID编号\n");
scanf("%d",&id);
find_link(head,id);
continue;
}
else if(strcmp("show",chose)==0)
{
printf_link(head);
}
else if(strcmp("out",chose)==0)
{
printf("退出\n");
exit(0);
}
else if(strcmp("",chose)==0)
{
;
}
else
{
printf("您的输入有误,请重新输入!\n");
}
}
return 0;
}
void show(void)
{
printf("**********************************************************\n");
printf("*********** 学生管理系统 *************\n");
printf("***********************add.增加信息***********************\n");
printf("***********************delete.删除信息********************\n");
printf("***********************change.更改信息********************\n");
printf("***********************find.查找信息**********************\n");
printf("***********************show.打印信息**********************\n");
printf("***********************out.退出系统***********************\n");
printf("**********************************************************\n");
}
STU *insert_link(STU * head,STU tmp)
{
STU * pi = (STU *)calloc(1,sizeof(STU));
*pi = tmp;
pi ->next = NULL;
if(NULL == head)
{
head = pi;
}
else
{
pi->next = head;
head = pi;
}
return head;
}
void printf_link(STU * head)
{
if(NULL == head)
{
printf("链表为空!\n");
return;
}
else
{
STU * pi = head;
while(pi != NULL)
{
printf("该生名为:%s 学号:%d 语文成绩:%5.2lf 数学成绩为:%5.2lf 英语成绩为:%5.2lf\n",pi->m_name,pi->m_id,pi->m_chinese,pi->m_math,pi->m_english);
pi = pi->next;
}
}
return ;
}
void find_link(STU * head,int id)
{
int flag = 0;
if(NULL == head)
{
printf("链表为空!\n");
}
else
{
STU * pi = head;
printf("进入查询链表中了\n");
while(pi != NULL)
{
if(id == pi->m_id)
{
flag++;
printf("找到这个人的了,它的信息为:\n");
printf("该生名为:%s 学号:%d 语文成绩:%5.2lf 数学成绩为:%5.2lf 英语成绩为:%5.2lf\n",pi->m_name,pi->m_id,pi->m_chinese,pi->m_math,pi->m_english);
}
pi = pi->next;
}
if(flag == 0)
{
printf("查无此人\n");
}
}
return ;
}
STU * delete_link(STU * head,int id)
{
if(NULL == head)
{
printf("链表为空\n");
return head;
}
else
{
STU * pi = head;
STU * pb = head;
while((pb->m_id != id) && (pb->next != NULL))
{
pi = pb;
pb = pb->next;
}
if(pb->m_id == id)
{
if(head == pb)
{
head = head->next;
printf("删除成功!\n");
}
else
{
pi->next = pb->next;
printf("删除成功!\n");
}
if(pb != NULL)
{
free(pb);
pb = NULL;
}
}
else if(pb->next == NULL)
{
printf("没有找到这个ID\n");
}
}
return head;
}
void change_link(STU * head,int id)
{
STU * pb = head;
float chinese;
float math;
float english;
char name[32] = "";
int flag = 0;
while(pb!=NULL)
{
if(pb->m_id == id)
{
printf("请修改%s的语文成绩为:",pb->m_name);
scanf("%lf",&pb->m_chinese);
printf("请修改%s的数学成绩为:",pb->m_name);
scanf("%lf",&pb->m_math);
printf("请修改%s的英语成绩为:",pb->m_name);
scanf("%lf",&pb->m_english);
flag++;
return ;
}
pb = pb->next;
}
if(flag == 0)
{
printf("没有找到ID为%d的学生信息\n");
}
return ;
}
再写链表之前,仔细思考每一个节点应该如何去设计,然后这此我写链表的时候,时间匆忙,链表节点的插入只是采用了头插发,可以对这个方面进行改进,可以是以学号进行排序,有序的排序,这个在查找的时候会更加便捷,我这个链表是采用遍历的方法,挺傻的
|