- /*
- *Copyright (c) 2017,烟台大学计算机与控制工程学院
- 文件名称:学生信息管理系统
- *文件标识:无
- *内容摘要:实现学生信息的输入、插入、删除、修改、输出
- *其他内容:无
- *当前版本:v1.0
- *完成日期:2017.12.21
- *创作人:李庆耀
- */
头文件:
linklist.h
运行结果:
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
typedef struct Student{
char name[22],no[22],sex[3];
int sco,age,nian,yue,ri;
}Student;
typedef struct LNode{
Student date;
struct LNode *next;
}LNode,*LinkList;
void Save(LNode *L);
void Ini(LinkList &L);//初始化单链表
void CreateList_R(LinkList &L) ;//创建单链表
void TraveList(LinkList &L) ;//输出学生信息函数
void Search_Pos(LinkList &L) ;//按姓名查找学生信息函数
void Insert(LinkList &L) ;//增加学生信息函数
void Delete(LinkList &L) ;//删除学生信息函数
void Get_Len(LinkList &L);//统计学生人数函数
void Delete1(LinkList &L) ;//删除学生信息函数
void gai(LinkList &L);//修改学生信息函数
#endif // LINKLIST_H_INCLUDED
源文件:linklis.cpp
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#include"linklist.h"
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
/*********************************************
* 功能描述:申请一个新结点,并将其初始化
* 输入参数:无
* 输出参数:无
*********************************************/
void Ini(LinkList &L) //初始化链表
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//创建头结点,其next域置为NULL
}
/*********************************************
* 功能描述:创建链表 录入学生信息
* 输入参数:学生姓名 年龄 学号 班级 性别 出生日期
* 输出参数:无
*********************************************/
void CreateList_R(LinkList &L)//创建链表
{
printf("请输入录入学生个数: ");
int N; scanf("%d",&N);
L->date.sco=N;
LNode *p=L;//p指向头结点
int i=0;
for(i=1;i<=N;++i) //循环建立数据节点s
{
LNode *b=(LinkList)malloc(sizeof(LNode)); b->next=NULL;
printf("\n请输入第%d个学生的姓名: ",i);
scanf("%s",b->date.name);
printf("\n请输入第%d个学生的学号: ",i);
scanf("%s",b->date.no);
printf("\n请输入第%d个学生的年龄: ",i);
scanf("%d",&b->date.age);
printf("\n请输入第%d个学生的性别: ",i);
scanf("%s",b->date.sex);
printf("\n请输入第%d个学生的出生日期(年 月 日): \n",i);
scanf("%d ",&b->date.nian
);
scanf("%d",&b->date.yue);
scanf("%d",&b->date.ri);
printf("\n请输入第%d个学生的班级: ",i);
scanf("%d",&b->date.sco);
p->next=b; //p的首节点指向b
p=b;
}
printf("\n信息录入成功!");
printf("\n\n输入回车键返回主菜单");
getch();//任意输入一个字符返回上一层
}
/*********************************************
* 功能描述:输出所有学生信息
* 输入参数:无
* 输出参数:学生姓名 学号 年龄 性别 班级 出生日期
*********************************************/
void TraveList(LinkList &L)//输出学生信息
{
if(L->next==NULL) printf("\n尚未录入学生信息,请录入!!!");
else{
LNode* p=L->next;//p指向首节点
printf("姓名\t学号\t年龄\t性别\t班级\t\t出生日期\n");
while(p!=NULL ) //p不为NULL输出p的节点的date域
{
printf("%-8s%-8s%-8d%-8s%-16d%d年%d月%d日\n",p->date.name,p->date.no,p->date.age,p->date.sex,p->date.sco,p->date.nian,p->date.yue,p->date.ri);
p=p->next;//p一项下一个节点
}
}
printf("\n\n输入回车键返回主菜单");
getch();//任意输入一个字符返回上一层
}
/*********************************************
* 功能描述:根据输入的姓名输出学生信息
* 输入参数:姓名
* 输出参数:学生姓名 学号 年龄 性别 班级 出生日期
*********************************************/
void Search_Pos(LinkList &L)//按姓名查找学生信息
{
printf("\n请输入学生姓名:");
char str[23]; scanf("%s",str);
LNode *p=L;
while(p->next&&strcmp(str,p->next->date.name)) p=p->next;
if(p->next)
{
printf("姓名\t学号\t年龄\t性别\t班级\t\t出生日期\n");
printf("%-8s%-8s%-8d%-8s%-16d%d年%d月%d日\n",p->next->date.name,p->next->date.no,p->next->date.age,p->next->date.sex,p->next->date.sco,p->next->date.nian,p->next->date.yue,p->next->date.ri);
}
else printf("\n找不到该学生信息!!!\n");
printf("\n\n输入回车键返回主菜单");
getch();
}
/*********************************************
* 功能描述:输入增加学生的学号 判断学号是否重复 然后输入学生信息
* 输入参数:学号 学生姓名 年龄 性别 班级 出生日期
* 输出参数:无
*********************************************/
void Insert(LinkList &L) //增加学生信息
{
printf("\n请输入增加学生学号:");
char str[23]; scanf("%s",str);//创建一个字符串 输入学生姓名
LNode *p=L;//p指向头结点
while(p->next&&strcmp(str,p->next->date.name))//查找学生姓名与字符串姓名相同的节点
p=p->next;
if(p->next)
{
printf("该学号已存在");
}
else
{
LNode *s=(LNode*)malloc(sizeof(LNode)); //创建新节点s 输入其date的域
printf("请输入要插入的学生的信息\n");
printf("姓名: "); scanf("%s",s->date.name);
strcpy(s->date.no,str);
printf("年龄: "); scanf("%d",&s->date.age);
printf("性别: "); scanf("%s",s->date.sex);
printf("出生日期 年: "); scanf("%d",&s->date.nian);
printf("出生日期 月: "); scanf("%d",&s->date.yue);
printf("出生日期 日: "); scanf("%d",&s->date.ri);
printf("班级: "); scanf("%d",&s->date.sco);
int i=0;
while(i<L->date.sco-1)
{
p=p->next;
L->date.sco++;
}
s->next=p->next;
p->next=s;
printf("\n插入成功!");
}
printf("\n\n输入回车键返回主菜单");
getch();
}
/*********************************************
* 功能描述:输入学生姓名删除学生信息
* 输入参数:学生姓名
* 输出参数:无
*********************************************/
void Delete(LinkList &L)//按姓名删除学生信息
{
if(L->date.sco<=0)//如果学生信息数为0
printf("学生人数为0,请先录入学生信息!!!");
else
{
printf("\n请输入学生姓名:");
char str[23]; scanf("%s",str);//创建一个字符串 输入学生姓名
LNode *p=L,*q;//p指向头结点
while(p->next&&strcmp(str,p->next->date.name))//查找学生姓名与字符串姓名相同的节点
p=p->next;
if(p->next)//如果有相同节点
{
q=p->next;
p->next=q->next;//从单链表删除q节点
free(q);//释放q节点
L->date.sco--;//学生个数减一
printf("\n删除成功!");
}
}
printf("\n\n输入回车键返回主菜单");
getch();
}
/*********************************************
* 功能描述:输入学号删除学生信息
* 输入参数:学号
* 输出参数:无
*********************************************/
void Delete1(LinkList &L) //按学号删除学生信息函数
{
if(L->date.sco<=0)//如果学生信息数为0
printf("学生人数为0,请先录入学生信息!!!");
else
{
printf("\n请输入学生学号:");
char str[23]; scanf("%s",str);//创建一个字符串 输入学生姓名
LNode *p=L,*q;//p指向头结点
while(p->next&&strcmp(str,p->next->date.no))//查找学生姓名与字符串姓名相同的节点
p=p->next;
if(p->next)//如果有相同节点
{
q=p->next;
p->next=q->next;//从单链表删除q节点
free(q);//释放q节点
L->date.sco--;//学生个数减一
printf("\n删除成功!");
}
}
printf("\n\n输入回车键返回主菜单");
getch();
}
/*********************************************
* 功能描述:统计学生个数
* 输入参数:无
* 输出参数:学生个数
*********************************************/
void Get_Len(LinkList &L)//统计学生信息个数
{
int n=0;
LNode *p=L;//p指向头结点,n置为0
while (p->next!=NULL)//查找p的下一个节点不为空时
{
n++;//n+1
p=p->next;//p指向下一个节点
}
printf("学生总数为 %d",n);
printf("\n\n输入回车键返回主菜单");
getch();
}
/*********************************************
* 功能描述:修改学生信息
* 输入参数:要修改的学号 修改后的学生姓名 年龄 性别 班级 出生日期
* 输出参数:学生姓名 年龄 性别 班级 出生日期
*********************************************/
void gai(LinkList &L)
{
printf("\n请输入学生学号:");
char str[23]; scanf("%s",str);//创建一个字符串 输入学生姓名
LNode *p=L,*q;//p指向头结点
while(p->next&&strcmp(str,p->next->date.no))//查找学生姓名与字符串姓名相同的节点
p=p->next;
if(p->next)//如果有相同节点
{
printf("姓名\t学号\t年龄\t性别\t班级\t\t出生日期\n");
printf("%-8s%-8s%-8d%-8s%-16d%d年%d月%d日\n",p->next->date.name,p->next->date.no,p->next->date.age,p->next->date.sex,p->next->date.sco,p->next->date.nian,p->next->date.yue,p->next->date.ri);
int h;
printf("\n是否要修改学生信息\n");
printf("1 是 2 不是\n");
scanf("%d",&h);
if(h==1)
{
q=p->next;
p->next=q->next;//从单链表删除q节点
free(q);//释放q节点
LNode *s=(LNode*)malloc(sizeof(LNode)); //创建新节点s 输入其date的域
printf("请输入修改后的学生的信息\n");
printf("姓名: "); scanf("%s",s->date.name);
printf("学号: "); scanf("%s",s->date.no);
printf("年龄: "); scanf("%d",&s->date.age);
printf("性别: "); scanf("%s",s->date.sex);
printf("出生日期 年: "); scanf("%d",&s->date.nian);
printf("出生日期 月: "); scanf("%d",&s->date.yue);
printf("出生日期 日: "); scanf("%d",&s->date.ri);
printf("班级: "); scanf("%d",&s->date.sco);
s->next=p->next;
p->next=s;
printf("修改成功\n");
}
else if(h==2)
{
printf("学生信息保留\n");
printf("\n\n输入回车键返回主菜单");
getch();
}
}
else
{
printf("\n没有该学生信息\n");
}
printf("\n\n输入回车键返回主菜单");
getch();
}
void Save (LNode *L)//保存链表数据到文件
{
LNode *p1;
int h;
ofstream out;
h=L->date.sco;
out.open("xuesheng.txt");
if(!out)
{
cout<<"打开文件失败"<<endl;
}
p1=L->next;
out<<h<<endl;
while(p1)
{
printf("%d",p1->date.age);
p1=p1->next;
}
out.close();
getch();
}
主函数():main.cpp
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#include"linklist.h"
#include<iostream>
using namespace std;
int main()
{
system("color 4e"); LinkList L; Ini(L);
while(1)
{
system("cls");
int choose;
printf("--------------------------欢迎使用学生信息管理系统----------------------------\n\n\n\n");
printf("\t\t\t******1.输入学生信息******\n");
printf("\t\t\t******2.查找学生信息******\n");
printf("\t\t\t******3.按姓名查找学生信息\n");
printf("\t\t\t******4.增加学生信息******\n");
printf("\t\t\t******5.按学号删除学生信息\n");
printf("\t\t\t******6.按姓名删除学生信息\n");
printf("\t\t\t******7.统计学生个数******\n");
printf("\t\t\t******8.修改学生信息******\n");
printf("\t\t\t******9.退出系统**********\n");
printf("\n\n请输入操做所对编号: ");
scanf("%d",&choose); puts("");
switch(choose)
{
case 1: CreateList_R(L); break;
case 2: TraveList(L); break;
case 3: Search_Pos(L); break;
case 4: Insert(L); break;
case 5: Delete(L); break;
case 6: Delete1(L); break;
case 7: Get_Len(L); break;
case 8: gai(L); break;
case 9: exit(0);
default: printf("\n输入有误! 请核对后重新输如入!!!\n");
printf("\n\n输入回车键返回主菜单"); getch();
break;
}
}
return 0;
}
运行结果:
输入学生信息:
查询学生信息:
按学号查询学生信息:
增加学生信息:
按学号删除:
按姓名删除:
8输出学生个数
修改学生信息: