#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "string.h"
typedef struct
{
int no;
char name[10];
char sex;
}Student;
typedef struct Node
{
Student data; //数据域
struct Node *next; //指针域
}Node,*LinkList;
LinkList create_LinkLast(LinkList L)
{
L=(LinkList)malloc(sizeof(Node));/*申请内存*/
L->next=NULL;/*建立空的单链表*/
return L;
}
int getNo(LinkList L)//输入姓名
{
int no;
while(1)
{
printf("请输入学号1000-9999:");
scanf("%d",&no);
if(no>1000&&no<9999)break;
printf("输入错误!
");
}
return 0;
}
char getSex() //输入性别
{
char sex;
while(1){
fflush(stdin);
printf("请输入性别(M或F):");
scanf("%c",&sex);
if(sex=='M'||sex=='m'||sex=='f'||sex=='F')
break;
else
printf("输入错误,您只能输入字符M(男)或者F(女)!
");
}
return sex;
}
Student getStudent(LinkList L)//数据输入
{
Student s1;
s1.no = getNo(L);
printf("请输入姓名:");
scanf("%s",s1.name);
s1.sex = getSex();
return s1;
}
void add_Head(LinkList L) //尾部添加
{
Node *p;
p= (LinkList)malloc(sizeof(Node));
p->data= getStudent(L);
p->next =L->next;
L->next = p;
printf("添加成功!");
}
show_LinkList(LinkList L) //显示
{
printf(" 1.全部显示
");
printf(" 2.按学号升序显示
");
printf(" 3.返回
");
Node *PL ,*p=L;//找到首节点
Student temp;
int flag=0,i;
PL=L;
scanf("%d",&i);
if(i==1)
{
while(PL->next)
{
PL=PL->next;
if(flag==0)
{
system("cls");
printf(" **************** 全部显示 ****************
");
printf("
| 学号 | 姓名 | 性别 |
");
}
printf(" | %d | %s | %c |
",PL->data.no,PL->data.name,PL->data.sex);
flag++;
}
if(flag==0)printf("没有数据!");
}
else if(i==2)
{
while(PL->next->next)
{
if(PL->next->data.no>PL->next->next->data.no)
{
temp = PL->next->data;
PL->next->data = PL->next->next->data;
PL->next->next->data = temp;
}
PL = PL->next;
}
while(p->next)
{
p=p->next;
if(flag==0)
{
system("cls");
printf(" **************** 全部显示 ****************
");
printf("
| 学号 | 姓名 | 性别 |
");
}
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
flag++;
}
if(flag==0)printf("没有数据!");
}
}
Node *getprior(LinkList L,Node *r)
{
Node *p=L;
while(p->next!=r)
{
p=p->next;
}
return p;
}
delete_LinkList(LinkList L) //删除节点
{
printf(" 1.学号删除信息
");
printf(" 2.姓名删除信息
");
printf(" 3.位置删除信息
");
printf(" 4.返回
");
int a,id,j=0;
char ch,ch_name[10];
Node *p=L,*r;
Student e;
scanf("%d",&a);
if(a==1)
{
printf("请输入学号:
");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
fflush(stdin);
printf("确定删除y or n?
");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
r=getprior(L,p);
r->next=p->next;
free(p);
printf("删除成功");
}
}
}
}
else if(a==2)
{
printf("请输入姓名:
");
scanf("%s",ch_name);
while(p->next)
{
p=p->next;
if(strcmp(p->data.name,ch_name)==0)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
fflush(stdin);
printf("确定删除y or n?
");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
r=getprior(L,p);
r->next=p->next;
free(p);
printf("删除成功");
}
}
}
}
else if(a==3)
{
printf("请输入位置:
");
scanf("%d",&id);
while(p->next&&j<id-1&&id>0)
{
p=p->next;
j++;
}
if(p->next==NULL||j>id-1)
{printf("输入位置有错!
");return 0;}
printf(" | %d | %s | %c |
",p->next->data.no,p->next->data.name,p->next->data.sex);
fflush(stdin);
printf("确定删除y or n?
");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
r=p->next;
p->next=p->next->next;
e=r->data;
free(r);
printf("
删除成功!");
}
}
else return 0;
}
void opan_LinkList(LinkList L) //读取学生信息
{
FILE *fp;
Node *s,*p=L;
if((fp=fopen("linklist.txt","rb"))==NULL)
{
printf("打开文件失败!
");
system("pause");
exit(1);
}
s=(Node *)malloc(sizeof(Node));
while(fread(&(s->data),sizeof(Student),1,fp)==1)
{
p->next=s;
s->next=NULL;
p=p->next ;
s=(Node *)malloc(sizeof(Node));
}
fclose(fp);
}
int save_LinkList(LinkList L) //保存学生信息
{
FILE *fp;
Node *p=L;
int i;
if((fp=fopen("linklist.txt","wb"))==NULL)
{
printf("打开文件失败
");
}
while(p->next)
{
p= p->next;
fwrite(&(p->data), sizeof(Student), 1, fp);
}
fclose(fp);
}
Node *getrear(LinkList L) //得到节点尾部的地址
{
struct Node *p;
p=L;
while(p->next)
{
p=p->next;
}
return p;
}
add_rear(LinkList L)//在尾部添加节点
{
Node *p,*r;
p=(LinkList)malloc(sizeof(Node));
p->data=getStudent(L);
printf("添加成功!");
r=getrear(L);
p->next=r->next;//r->next=NULL;
r->next=p;
}
Node *middle(LinkList L)
{
int flag=0,id;
Node *p=L;
char ch;
printf("请输入学生学号:
");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(id==p->data.no)
{
flag++;
system("cls");
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
printf("确定插入y/n
");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
return p;
}
else return 0;
}
}
if(flag==0)
{
printf("无法查到!自动添加到表尾:
") ;
p= getrear(L);
return(p);
}
}
add_middle(LinkList L) //中间插入
{
Node *s,*p;
char ch;
p=(LinkList)malloc(sizeof(Node));
s=middle(L);
p->next=s->next;
s->next=p;
p->data=getStudent(L);
}
find(LinkList L)
{
printf(" 1.学号查找信息
");
printf(" 2.姓名查找信息
");
printf(" 3.位置查找信息
");
printf(" 4.返回
");
int i,id,flag=0,j=0;
Node *p=L;
char ch_name[10];
scanf("%d",&i);
if(i==1)
{
printf("请输入学号:
");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
flag++;
}
}
}
else if(i==2)
{
printf("请输入姓名:
");
scanf("%s",ch_name);
while(p->next)
{
p=p->next;
if(strcmp(p->data.name,ch_name)==0)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
flag++;
}
if(flag==0)printf("姓名为%s的学生信息不存在!",ch_name);
}
}
else if(i==3)
{
printf("请输入位置:
");
scanf("%d",&id);
while(p->next&&j<id-1&&id>0)
{
p=p->next;
j++;
}
if(p->next==NULL||j>id-1)
{
printf("输入位置有错!
");return 0;
}
printf(" | %d | %s | %c |
",p->next->data.no,p->next->data.name,p->next->data.sex);
}
}
Modify_LinkList(LinkList L)
{
printf(" 1.学号修改
");
printf(" 2.姓名修改
");
printf(" 3.性别修改
");
printf(" 4.返回
");
int a,id,flag=0;
char ch,ch_name[10],ch__name[10];
Node *p=L;
scanf("%d",&a);
if(a==1)
{
printf("请输入学号:
");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
flag++;
break;
}
}
if(flag==0)
{
printf("学号为%d的学生信息不存在!",id);return 0;
}
printf("确定修改y/n?
");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
p->data.no=getNo(L);
}
else return 0;
}
else if(a==2)
{
printf("请输入修改的姓名:
");
scanf("%s",ch_name);
while(p->next)
{
p=p->next;
if(strcmp(p->data.name,ch_name)==0)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
flag++;
break;
}
}
if(flag==0)
{
printf("姓名为%s的学生信息不存在!",ch_name);return 0;}
printf("确定修改y/n?
");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
printf("请输入姓名:");
scanf("%s",ch__name);
strcpy(p->data.name,ch__name);
printf("
修改成功!
");
}
else return 0;
}
else if(a==3)
{
printf("请输入学号:
");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf(" | %d | %s | %c |
",p->data.no,p->data.name,p->data.sex);
flag++;
break;
}
}
if(flag==0)printf("学号为%d的学生信息不存在!",id);
printf("确定修改y/n?
");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
p->data.sex=getSex();
printf("
修改成功!
");
}
else return 0;
}
}
main()
{
LinkList L;
int i,a;
L=create_LinkLast(L);
opan_LinkList(L);
while(1)
{
system("cls");
printf(" ************************************
");
printf(" ****** 学生系统 ******
");
printf(" ************************************
");
printf(" 1.添加学生信息
");
printf(" 2.显示学生信息
");
printf(" 3.插入学生信息
");
printf(" 4.删除学生信息
");
printf(" 5.查找学生信息
");
printf(" 6.修改学生信息
");
printf(" 7.保存数据
");
printf(" 8.退出
");
scanf("%d",&i);
if(i==1)
{
add_Head(L);
}
else if(i==2)
{
system("cls");
show_LinkList(L);
}
else if(i==3)
{
system("cls");
printf(" 1.后面添加
");
printf(" 2.中间添加
");
printf(" 3.返回
");
scanf("%d",&a);
if(a==1)add_rear(L);
else if(a==2)
{
add_middle(L);
}
}
else if(i==4)
{
system("cls");
delete_LinkList(L);
}
else if(i==5)
{
system("cls");
find(L);
}
else if(i==6)
{
system("cls");
Modify_LinkList(L);
}
else if(i==7)save_LinkList(L);
else return 0;
getch();
}
}