#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof (struct student)
struct student {
int num;
char name[10];
char sex[5];
char birthday[10];
struct student *prev;
struct student *next;
};
struct student *creat(void)
{
struct student * head,*tail;
struct student *p1,*p2,*p3;
int n=0;
int i;
p1= (struct student * )malloc(LEN);
printf ("请依次输入:/n学生学号/t姓名/t性别/t生日/t:输入“0”结束/n");
printf("学生学号:");scanf("%d",&p1->num);getchar();
printf("姓名:");gets(p1->name);
printf("性别:");gets(p1->sex);
printf("生日:");gets(p1->birthday);
p1->next=NULL;
p1->prev=NULL;
while (p1->num != 0)
{
n=n+1;
if (n == 1)
head=p1;
else
{
p2->next=p1;
p1->prev=p2;
p1->next=NULL;
}
p2=p1;
p1=(struct student * )malloc (LEN);
rp1: printf("学生学号:");scanf("%d",&p1->num);
p3=head;
for(i=0;i<n;i++ )
{
if (p1->num!=p3->num)
p3=p3->next;
else
{
printf("学号重复,请重输!/n");
goto rp1;
}
}
getchar();
printf("姓名:");gets(p1->name);
printf("性别:");gets(p1->sex);
printf("生日:");gets(p1->birthday);
}
if(p1->num == 0)
{
tail=p2;
}
return(head);
}
void print(struct student * head)
{
struct student *p;
p=head;
if (p== NULL)
{
printf("尚未建立学生信息/n");
return;
}
else
{ printf("/n 学生信息如下:/n");
printf("学号/t姓名/t性别/t生日/t/n");
while ( p != NULL)
{printf("%d/t%s/t%s/t%s/n",p->num,p->name,p->sex,p->birthday);
p=p->next;
}
}
}
struct student *del(struct student *head ,int num)
{
struct student *p1,*p2,*p3;
if (head == NULL)
{
printf("/n尚未建立学生信息/n");
}
p1=head ;
while (num != p1->num &&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(num == p1->num)
{
if (p1==head)
{
head=p1->next;
free(p1);
}
else if(num==p1->num&&p1->next != NULL)
{
p3=p1->next;
p3->prev=p2;
p2->next=p3;
free(p1);
}
else if(num== p1->num&& p1->next == NULL)
{
p2->next=NULL;
free(p1);
}
printf(" 学生%d已经成功删除/n",num);
}
else printf(" 没有该学生!/n",num);
return head;
}
struct student *insert(struct student * head ,struct student *stud)
{
struct student *p0,*p1,*p2;
p1=head;
p0=stud;
if (head == NULL)
{
head=p0;
p0->next=NULL;
p0->prev=NULL;
}
else
{
while ((p0->num > p1->num)&&(p1->next != NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num <= p1->num)
{
if(head == p1)
{
head=p0;
p0->next=p1;
p1->prev=p0;
p1->next=NULL;
}
else
{
p2->next=p0;
p0->prev=p2;
p1->prev=p0;
p0->next=p1;
}
}
else
{
p1->next=p0;
p0->next=NULL;
p0->prev=p1;
}
}
return (head);
}
void searchnum(struct student *head )
{
int num;
struct student *p1;
p1=head ;
if (p1 == NULL)
{
printf("/n没有任何信息!/n");
return;
}
else
{
printf("/n请输入要查找的学号: /n");
scanf("%d",&num);
while (num!=p1->num &&p1->next!=NULL)
{
p1=p1->next;
}
if(num == p1->num)
{
printf("学号/t姓名/t性别/t生日/t/n");
printf("%d/t%s/t%s/t%s/t",p1->num,p1->name,p1->sex,p1->birthday);
}
else
printf ("/n不存在这个学生/n");
}
}
void searchname(struct student *head)
{
struct student *p1;
char name[10];
p1=head ;
if (head == NULL)
{
printf("/n没有任何信息!/n");
return;
}
else
{
printf("/n请输入要查找的姓名: /n");
scanf("%s",name);
while ( strcmp(p1->name,name)!=0 && p1->next!=NULL)
{
p1=p1->next;
}
if(strcmp(p1->name,name)==0)
{
printf("学号/t姓名/t性别/t生日/t/n");
printf("%d/t%s/t%s/t%s/t",p1->num,p1->name,p1->sex,p1->birthday);
}
else
printf ("/n不存在这个学生/n");
}
}
int getlength(struct student *head)
{
int n=0;
struct student *p;
p=head;
while(p!=NULL)
{
p=p->next;
n=n+1;
}
return n;
}
long modi()
{
long be,bi,b;
lp2: printf("/n请输入新密码:");
scanf("%ld",&be);
printf("/n请确认新密码:");
scanf("%ld",&bi);
if (be == bi)
{
b=be;
printf("/n你的新密码已经确认,请重新进入系统:");
}
else
{
printf("/n你的密码不一致,请重新输入:");
goto lp2;
}
return b;
}
void save(struct student * head)
{
struct student *p;
p=head;
FILE * fp;
if((fp=fopen("stulist","wb")) == NULL)
{
printf("不能打开文件/n");
return;
}
while (p!=NULL)
{
if (fwrite(p,sizeof (struct student),1,fp)!=1)
printf("file write error/n");
p=p->next;
}
printf("文件已经成功保存/n");
fclose(fp);
}
void read(struct student * head)
{
struct student *p;
p=head;
FILE*fp;
if((fp=fopen("stulist","rb")) == NULL)
{
printf("没有任何资料/n");
return;
}
printf("学号/t姓名/t性别/t生日/t/n");
while (p!=NULL)
{
fread(p,sizeof(struct student),1,fp);
printf("%d/t%s/t%s/t%s/t/n",p->num,p->name,p->sex,p->birthday);
p=p->next;
}
fclose(fp);
}
void main()
{
struct student *stu,*p3,*head=NULL;
long a,b=1;
int num;
int option;
lp1: printf(" /n 进入系统 请输入密码:/n");
scanf("%d",&a);
if (a == b)
{while(1)
{
printf("/n **********学生档案管理系统**************/n");
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(" 9.修改密码/n");
printf(" 10.显示学生数目/n");
printf(" 11.退出/n");
printf(" ****************************************/n");
printf(" Please enter your choice (1-11)...");
scanf("%d",&option);
switch(option)
{
case 1:
head=creat();
break;
case 2 :
print(head);
break;
case 3:
printf("/n请输入要删除的学号 :/n");
scanf ("%d",&num);
head=del(head,num);
break;
case 4:
printf ("/n请输入要添加的学生的资料:/n");
stu= (struct student * )malloc(LEN);
rp2: printf("学生学号:");scanf("%d",&stu->num);
p3=head;
while (stu->num != p3->num && p3->next!=0)
{
p3=p3->next;
}
if (stu->num == p3->num)
{
printf("学号重复,请重输!/n");
goto rp2;
}
getchar();
printf("姓名:");gets(stu->name);
printf("性别:");gets(stu->sex);
printf("生日:");gets(stu->birthday);
head=insert(head,stu);
break;
case 5:
searchnum(head);
break;
case 6:
searchname(head);
break;
case 7:save(head);break;
case 8:read(head);break;
case 9:
b=modi();
goto lp1;
break;
case 10:
printf("总共有%d个学生/n",getlength(head));
break;
case 11:
return;
default:
printf("错误,只能输入1--11/n");
}
}
}
else
{
printf("/n密码错误/n");
goto lp1;
}
}