资源描述
数据结构课程设计
学生信息管理系统C语言编写 仅供参考:
#include<stdio。h>
#include<stdlib。h〉
#include<string。h>
#include〈conio。h>
#define LEN sizeof(LNode)
typedef struct LNode
{
//用于存放学生信息节点
int stuNumber;
char telenum[50];
int age;
char chass[50];
char deptName[50];
/*char zhuanYe[50];
char adress[50];*/
char name[20];
struct LNode *next;
}LNode,*Link;
//****************创建链表结点**************************************************************************
Link createLink(Link L)
{ //初始化定义函数,声明变量
void inserStu(Link L,Link Elem);//定义插入函数
int count(Link L);
int temp;
temp=count(L);
printf("节点个数为%d:\n”,temp);
Link p;
int num=1, stuNumber;
char telenum[50];
char name[20];
int age;
/* char deptName[50];
char adress[50];
char zhuanYe[50];*/
char chass[50];
//开始输出学生信息
while(1)
{
printf("请输入学生的信息:学号,姓名,年龄,班级,院系,专业,家庭住址,电话号码\n”);
printf("学号输入负数结束!\n");
printf(”请输入学号%d: ",num);
scanf(”%10d”,&stuNumber);
if(stuNumber〈0) {break;}
printf(”请输入姓名%d: ”,num);
getchar();
gets(name);
printf(”请输入年龄%d: ",num);
scanf("%d”,&age);
printf(”请输入班级%d: ”,num);
getchar();
gets(chass);
printf(”请输入电话号码: ",num);
getchar();
gets(telenum);
/* printf(”请输入院系%d: ”,num);
getchar();
gets(deptName);*/
if(stuNumber〉=0)
{
p=(Link)malloc(LEN);
p-〉stuNumber=stuNumber;
strcpy(p—〉chass,chass);
/* strcpy(p-〉deptName,deptName);*/
p-〉age=age;
strcpy(p-〉telenum,telenum);
strcpy(p—〉name,name);//插入新结点
inserStu(L,p);
num++;
}
}
return (L);
}
//******************打印头结点为L的学生记录********************************************************
void printList(Link L)
{
printf(”\n*********************学号,姓名,年龄,班级,电话号码**************************\n”);
printf("\n 学号 姓名 年龄 专业班级 电话号码 \n”);
int n=1;
Link p=L;
int count(Link L);
int temp;
temp=count(L);//结点个数:
if(temp==0)printf("系统中没有元素\n”);//判断学生管理系统中有无信息
else
while(p->next!=NULL)
{
printf("%2d %-9d”,n,p—〉next—>stuNumber);
printf("%-8s %—5d %—12s %s \n",p-〉next->name, p—〉next-〉age,p—>next->chass,p—〉next—〉telenum/*p—〉next-〉deptName*/);//首个字符打印不出来
p= p—〉next;
n++;
}
printf("\n***********************************************************************************\n");
return;
}
//********************************插入学生信息**************************************
void inserStu(Link L,Link Elem)
{
Link prior(Link L,Link p);
Link p=L—>next;//*******%%%%****
while(p!=NULL&&Elem—〉stuNumber〉=p->stuNumber)
{
if(p—〉stuNumber==Elem—>stuNumber)
{
printf("重复输入学号,输入失败!");return ;
}
p=p—〉next;
}//确定Elem的插入位置
if(p==NULL)
{
p=prior(L,p);Elem—〉next=NULL;p—〉next=Elem;//若为空表,插入到头结点之后
}
else
{
p=prior(L,p);Elem->next=p—〉next;p—>next=Elem;
}
}
//***********************找到当前地址元素的前一元素的地址*************************************************************************
Link prior(Link L,Link p)
{
if(L—>next==NULL)return(L);
Link p_prior=L;
while(p_prior->next!=p)
{
p_prior= p_prior—>next ;
}
return (p_prior);
}
//********************************8按学号查询学生信息***************************************************************************
int searchName(Link L,char n[])
{
int flag=0;//标志要查找的学生和学生记录中的姓名是否匹配
Link p=L—〉next;
int seat=1;
if(L-〉next==NULL||L==NULL)printf("没有学生信息\n”);
else
{
while(p!=NULL)
{
if(!strcmp(p-〉name,n))//比较要查找的姓名是否和当前学生信息所指的姓名匹配
{
flag=1;//输入姓名匹配
printf("要查找的是第%d位学生\n”,seat);
printf(”学号是:%d 名字:%s 年龄:%d 班级:%s 手机号:%s\n",p-〉stuNumber,p-〉name,p-〉age,p->chass,p—〉telenum);
}
p=p—〉next ;seat++;
}
}
return flag;
}
//****************************************按学号查找学生信息*********************************************************************
int searchNum(Link L,int n)
{
int flag=0;//标志要查找的学生和管理信息系统中的学号是否匹配
Link p=L-〉next;
int seat=1;
if(L-〉next==NULL)printf("没有学生信息\n");
else
{
while(p!=NULL)
{
if(p—〉stuNumber〈=n)
{
if(p—〉stuNumber==n)//比较要查找的学号是否和当前学生信息所指的学号匹配
{
flag=1;//输入学号匹配
printf(”要查找的是第%d位学生\n",seat);
printf(”学号是:%d 名字:%s 年龄:%d 班级:%s 手机号:%s\n",p-〉stuNumber,p—>name,p—〉age,p—>chass,p—〉telenum);
}
}
p=p—〉next ;seat++;
}
}
return flag;
}
//*******************************从通讯录中删除第i个元素***************************************************************************
void deleteElem(Link L,int i)
{
Link p=L;
int j=0;
while(p->next&&j〈i-1)
{
p= p-〉next;j++;
}
if(!(p—〉next))//判断i时候合法,i不能大于元素的个数,也不能小于等于0
{
printf(”第%d个学生删除失败\n",i);
return;
}
Link q=p—〉next;
p—〉next=q-〉next;
free(q);
}
//*******************按姓名删除学生信息**********************************************************************************************
int deleName(Link L, char n[])
{ void deteStu(Link);
int flag=0;//判断要删除的学生与系统中的姓名是否匹配
Link p=L—〉next;
int seat =1;
if(L—>next==NULL){printf(”\n删除提示:系统中没有元素,删除失败!\n”);deteStu( L);}
else
{
while(p!=NULL)
{
if(!strcmp(p—>name ,n))//比较名字是否匹配
{
flag=1;
printf("%s”,p—〉name );
p=p—>next;
deleteElem(L,seat);//删除第i个学生的信息
}
else
{
p=p-〉next ;seat++;
}
if(flag)printf(”被删除了\n”);
}
}
return flag;
}
//*****************按学号删除学生信息*****************************************************************
int deleNum(Link L,int n)
{ void deteStu(Link);
int flag=0;
Link p=L—>next ;
int seat=1;
if(L—〉next==NULL)
{
printf("\n删除提示:系统中没有元素,删除失败!\n");deteStu( L);
}
else
{
while(p!=NULL)
{
if(p->stuNumber==n)
{
flag=1;
printf(”%d”,p—〉stuNumber);
p=p—>next;
deleteElem(L,seat);
break;
}
p=p->next ;
seat++;
}
if(flag){
printf("被删除了\n");}
else{
printf("没有找到学生信息\n”);
}
}
return flag;
}
//*************************************************************************************
void searchWay1(Link L)
{ void searchMenu(Link L);
int searchWay=0;//控制跳出循环,再次选择查询方式
if(searchWay==0)
{
printf(”请输入要查询的学生的学号:\n”);
int n,s;
scanf("%d”,&n);
s=searchNum(L, n);
if(s==0)printf(”查找失败\n”);
searchWay=1;
}
if(searchWay==1)
{
searchMenu( L);
}
}
//********************************************************************************
void searchWay2(Link L)
{ void searchMenu(Link L);
int searchWay=0;//控制跳出循环,再次选择查询方式
if(searchWay==0)
{
char n[20];int flag;
printf("请输入要查询的学生姓名\n”);
char temp2=getchar();
gets(n);
flag= searchName(L,n);
if(flag==0)printf(”查找失败!\n");
searchWay=1;
}
if(searchWay==1)
{
searchMenu( L);
}
}
//*****************************************************************8
void searchMenu(Link L)
{
int mainMenu();
printf(” ********************** 查询菜单 ************************************** \n");
printf(” *** 1 输入学生学号查询学生信息 \n");
printf(” *** 2 输入学生姓名查询学生信息 \n");
printf(” *** 3 返回上级菜单 \n");
printf(" ********************** 查询菜单 ************************************** \n");
printf(”请选择1—3: ");
int menu;
scanf("%d”,&menu);
switch(menu)
{
case 1:{ searchWay1(L);break;}
case 2:{ searchWay2(L);break;}
case 3:{
break;//跳回主菜单程序
}
}
}
//************************************更新学生信息模块*****************************************
void alterStu(Link L)//按学号更新学生信息
{
int n;printf(”请输入要修改的学生学号:”);
scanf(”%d”,&n);
Link p=L—〉next;
if(p==NULL){printf("学生管理系统没有学生信息!");}
while(p!=NULL)//循环查找学生信息,如果找到该学号则进入循环体更改学生信息
{//**********************************************************************************************
if(p—〉stuNumber==n){
int num=1, stuNumber,age;
char telenum[50];
char name[20];
char chass[50];
printf(”***********************更改学生信息*****************************************\n”);
printf(”请输入学生的学号,姓名和电话号码\n");
printf("请输入学号%d: ”,num);
scanf("%d”,&stuNumber);
printf(”请输入姓名%d: ”,num);
getchar();
gets(name);
printf(”请输入年龄%d: ",num);
scanf(”%d”,&age);
printf(”请输入班级%d: ",num);
getchar();
gets(chass);
printf(”请输入电话号码: ",num);
getchar();
gets(telenum);
p—>age=age;
p—〉stuNumber=stuNumber;
strcpy(p—〉telenum,telenum);
strcpy(p—〉name,name);
strcpy(p-〉chass,chass);
//更新新结点
printf("***********************更改学生信息完毕*****************************************\n");
//*************************************************************************************************
}
p=p—〉next;
}
}
//****************保存学生信息模块***************************************************************************
void keepStu(Link L)
{
Link p=L->next;
FILE* fp;
if((fp=fopen("student。txt”,"r"))==NULL)//打开文件,不存在此文件则新建
{
fp=fopen(”E:\\测试\\student.txt”,”w”);
fclose(fp);
}
fp=fopen("E:\\测试\\student。txt”,"a");
while(p!=NULL)
{
fprintf(fp,"%d\t%s\t%s\n”,p—〉stuNumber,p—>name,p—〉telenum);
p=p—>next;
}
fclose(fp);
printf(”文件保存成功!\n”);
}
//********************统计结点个数模块***********************************************************************************
int count(Link L)
{
int n=0;
Link p=L->next;
if(p==NULL){printf("不存在学生信息\n");}
while(p!=NULL)
{
p=p—>next;
n++;
}
return n;
}
//********************************导入学生信息模块**********************************************************************
Link stuEntry()
{
FILE* fp;
Link p,q ,L;
if((fp=fopen(”E:\\测试\\student.txt","r"))==NULL)//打开文件,不存在此文件则新建
{
;
}
L=q=(Link)malloc(LEN);
printf(”\n学号 姓名 手机号 \n");
printf(”**********************************************************\n”);
while(!feof(fp))
{p=(Link)malloc(LEN);
fscanf(fp,”%d\t%s\t%s\n”,&p—〉stuNumber,&p-〉name,&p—>telenum);
printf("\n%d\t%s\t%s\n”,p—>stuNumber,p-〉name,p—〉telenum);
q—〉next=p;
q=p;
}
q->next=NULL;
fclose(fp);
printf(”按任意键结束:”);
getch();//返回
return L;
}
//********************添加学生信息**************************************************************************
void AddStu(Link L)
{ int temp;
temp=count(L);
printf(”节点个数为%d:\n”,temp);
if(temp==0){createLink(L);}//如果没有学生信息则调用初始化函数
createLink(L);
}
//****************删除学生菜单****************************************************
void deteStu(Link L)
{
int flag=0,way,n;
printf(”\n************************ 删除菜单 ********************\n");
printf(”\n选择操作方式************* 1:按学号 ********************\n”);
printf(” ************* 2:按姓名 ********************\n");
printf(” ************* 3: 返回主菜单 *********************\n");
printf("\n请输入删除方式:”);
scanf(”%d”,&way);
if(way<1||way〉3){deteStu(L);}
switch (way)
{
case 1: {
printf("请输入要删除的学生学号:");
scanf(”%d”,&n);
flag= deleNum(L,n);break;
}
case 2:{
char n[20];
printf(”请输入要删除的学生姓名:");
char temp1=getchar();
gets(n);
flag=deleName(L,n);break;
}
case 3:{break;}
}
if(flag)
{
printf("删除成功!\n”);deteStu(L);
}
}
//**********************主菜单程序******************************************************************************
int mainMenu()
{
printf(”\n****************************欢迎使用学生管理信息系统***********************************************\n”);
printf("* *** 1 输入学生信息 **** * \n”);
printf(”* *** 2 显示学生信息 **** * \n”);
printf(”* *** 3 查询学生信息 **** * \n”);
printf(”* *** 4 更新学生信息 **** * \n");
printf("* *** 5 添加学生信息 **** * \n");
printf(”* *** 6 删除学生信息 **** * \n”);
printf(”* *** 7 保存学生信息 **** * \n");
printf(”* *** 8从文件导入学生信息 **** * \n");
printf("* *** 0 退出管理信息系统 **** * \n");
printf("****************************欢迎使用学生管理信息系统***********************************************”);
int menu=0;
printf("请选择0-8:”);
scanf("%d”,&menu);
if(menu<0&&menu〉8)
{
printf(”输入无效,请正确输入有效序号0—8:”);
scanf(”%d”,&menu);
}
return menu;
}
//**************************main()程序*****************************************************************************************************
void main()
{
Link L=(Link)malloc(LEN);//在主函数上首先让结构体指针初始化;
L-〉next=NULL;
int flag=0;//学生信息是否建立
int menu=0;//菜单选项
do{
menu=mainMenu();
switch(menu)//用于调用子菜单
{
case 1:{L=createLink(L);break;}
case 2:{printList(L); break;}
case 3:{searchMenu(L); break;}
case 4:{alterStu(L) ;break;}
case 5:{createLink(L);break;}
case 6:{deteStu( L); break;}
case 7:{keepStu( L); break;}
case 8:{L=stuEntry();break;}
case 0:{return;}
}
}while(1);
}
//******************************************************************************************************************************
展开阅读全文