c语言单链表学生系统(注释太少,有问题请私聊 谢谢!)
#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("输入错误!\n");
}
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(女)!\n");
}
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("\t\t\t1.全部显示\n");
printf("\t\t\t2.按学号升序显示\n");
printf("\t\t\t3.返回\n");
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("\t\t**************** 全部显示 ****************\n");
printf("\n\n\n\t\t|\t学号\t|\t姓名\t|\t性别\t|\n");
}
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",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("\t\t**************** 全部显示 ****************\n");
printf("\n\n\n\t\t|\t学号\t|\t姓名\t|\t性别\t|\n");
}
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",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("\t\t\t1.学号删除信息\n");
printf("\t\t\t2.姓名删除信息\n");
printf("\t\t\t3.位置删除信息\n");
printf("\t\t\t4.返回\n");
int a,id,j=0;
char ch,ch_name[10];
Node *p=L,*r;
Student e;
scanf("%d",&a);
if(a==1)
{
printf("请输入学号:\n");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
fflush(stdin);
printf("确定删除y or n?\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("请输入姓名:\n");
scanf("%s",ch_name);
while(p->next)
{
p=p->next;
if(strcmp(p->data.name,ch_name)==0)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
fflush(stdin);
printf("确定删除y or n?\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("请输入位置:\n");
scanf("%d",&id);
while(p->next&&j<id-1&&id>0)
{
p=p->next;
j++;
}
if(p->next==NULL||j>id-1)
{printf("输入位置有错!\n");return 0;}
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->next->data.no,p->next->data.name,p->next->data.sex);
fflush(stdin);
printf("确定删除y or n?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
r=p->next;
p->next=p->next->next;
e=r->data;
free(r);
printf("\n删除成功!");
}
}
else return 0;
}
void opan_LinkList(LinkList L) //读取学生信息
{
FILE *fp;
Node *s,*p=L;
if((fp=fopen("linklist.txt","rb"))==NULL)
{
printf("打开文件失败!\n");
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("打开文件失败\n");
}
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("请输入学生学号:\n");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(id==p->data.no)
{
flag++;
system("cls");
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
printf("确定插入y/n\n");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
return p;
}
else return 0;
}
}
if(flag==0)
{
printf("无法查到!自动添加到表尾:\n") ;
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("\t\t\t1.学号查找信息\n");
printf("\t\t\t2.姓名查找信息\n");
printf("\t\t\t3.位置查找信息\n");
printf("\t\t\t4.返回\n");
int i,id,flag=0,j=0;
Node *p=L;
char ch_name[10];
scanf("%d",&i);
if(i==1)
{
printf("请输入学号:\n");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
flag++;
}
}
}
else if(i==2)
{
printf("请输入姓名:\n");
scanf("%s",ch_name);
while(p->next)
{
p=p->next;
if(strcmp(p->data.name,ch_name)==0)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
flag++;
}
if(flag==0)printf("姓名为%s的学生信息不存在!",ch_name);
}
}
else if(i==3)
{
printf("请输入位置:\n");
scanf("%d",&id);
while(p->next&&j<id-1&&id>0)
{
p=p->next;
j++;
}
if(p->next==NULL||j>id-1)
{
printf("输入位置有错!\n");return 0;
}
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->next->data.no,p->next->data.name,p->next->data.sex);
}
}
Modify_LinkList(LinkList L)
{
printf("\t\t\t1.学号修改\n");
printf("\t\t\t2.姓名修改\n");
printf("\t\t\t3.性别修改\n");
printf("\t\t\t4.返回\n");
int a,id,flag=0;
char ch,ch_name[10],ch__name[10];
Node *p=L;
scanf("%d",&a);
if(a==1)
{
printf("请输入学号:\n");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
flag++;
break;
}
}
if(flag==0)
{
printf("学号为%d的学生信息不存在!",id);return 0;
}
printf("确定修改y/n?\n");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
p->data.no=getNo(L);
}
else return 0;
}
else if(a==2)
{
printf("请输入修改的姓名:\n");
scanf("%s",ch_name);
while(p->next)
{
p=p->next;
if(strcmp(p->data.name,ch_name)==0)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
flag++;
break;
}
}
if(flag==0)
{
printf("姓名为%s的学生信息不存在!",ch_name);return 0;}
printf("确定修改y/n?\n");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
printf("请输入姓名:");
scanf("%s",ch__name);
strcpy(p->data.name,ch__name);
printf("\n修改成功!\n");
}
else return 0;
}
else if(a==3)
{
printf("请输入学号:\n");
scanf("%d",&id);
while(p->next)
{
p=p->next;
if(p->data.no==id)
{
printf("\t\t|\t%d\t|\t%s\t|\t%c\t|\n",p->data.no,p->data.name,p->data.sex);
flag++;
break;
}
}
if(flag==0)printf("学号为%d的学生信息不存在!",id);
printf("确定修改y/n?\n");
fflush(stdin);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
p->data.sex=getSex();
printf("\n修改成功!\n");
}
else return 0;
}
}
main()
{
LinkList L;
int i,a;
L=create_LinkLast(L);
opan_LinkList(L);
while(1)
{
system("cls");
printf("\t\t************************************\n");
printf("\t\t****** 学生系统 ******\n");
printf("\t\t************************************\n");
printf("\t\t\t1.添加学生信息\n");
printf("\t\t\t2.显示学生信息\n");
printf("\t\t\t3.插入学生信息\n");
printf("\t\t\t4.删除学生信息\n");
printf("\t\t\t5.查找学生信息\n");
printf("\t\t\t6.修改学生信息\n");
printf("\t\t\t7.保存数据\n");
printf("\t\t\t8.退出\n");
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("\t\t\t1.后面添加\n");
printf("\t\t\t2.中间添加\n");
printf("\t\t\t3.返回\n");
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();
}
}