1、非链表实现:
本系统包括以下功能:
1、学生信息的整体注册
2、学生信息的修改
3、学生成绩信息的录入
4、学生信息的添加
5、恢复误删的学生信息
6、学生信息的删除
7、密码修改保存函数
8、学生信息的查询
9、密码修改函数
10、学生信息管理系统的菜单函数
- #include "malloc.h"
- #include "string.h"
- #include "stdlib.h"
- #include "conio.h"
- #define M 3
- struct student
- {
- char num[10]; /* 学生的学号 */
- char name[20]; /* 学生的姓名 */
- char sex[5]; /* 学生的性别 */
- int age; /* 学生的年龄 */
- char birth[20]; /* 学生的出生年月 */
- long tele; /* 学生的电话号码 */
- char addr[30]; /* 学生的地址 */
- char party[10]; /* 学生是否为党员 */
- float score[M]; /* 学生各门学科成绩 */
- float total; /* 学生的学科成绩总分 */
- struct student *next;
- }stud[100];
- struct secret
- {
- char user[30];
- char code[30];
- }use[100];
- int len; //学生人数
- /
- /*学生信息写入到文件中-----系统函数*/
- /
- void writetxt(struct student *head)
- {
- struct student *p;
- p=head;
- FILE *fp;
- fp=fopen("d://student.txt","wb");
- if(fp==NULL)
- {
- printf("cannot open");
- return ;
- }
- while(p!=NULL)
- {
- fwrite(p,sizeof(struct student),1,fp);
- p=p->next;
- }
- fclose(fp);
- }
- /
- /* 学生信息的整体注册*/
- /
- struct student *create( )
- {
- char ch;
- char ok;
- int i;
- struct student *p,*p1,*head,*p2;
- FILE *fp;
- fp=fopen("d://student.txt","rb");
- if(fp==NULL)
- {
- printf("/n 文件还不存在,是否创建?(Y/N)/n");
- ch=getchar();
- len=1;
- scanf("%c",&ok);
- if(ok=='Y'||ok=='y')
- {
- p1=p2=(struct student *) malloc(sizeof(struct student));
- if((len)<10)
- printf("请输入0%d的学号:",len);
- else
- printf("请输入%d的学号:",len);
- scanf("%s",p1->num);
- if((len)<10)
- printf("请输入0%d的姓名:",len);
- else
- printf("请输入%d的姓名:",len);
- scanf("%s",p1->name);
- if((len)<10)
- printf("请输入0%d的性别:",len);
- else
- printf("请输入%d的性别:",len);
- scanf("%s",p1->sex);
- ch=getchar();
- if((len)<10)
- printf("请输入0%d的年龄:",len);
- else
- printf("请输入%d的年龄:",len);
- scanf("%d",&p1->age);
- if((len)<10)
- printf("请输入0%d的生日:",len);
- else
- printf("请输入%d的生日:",len);
- scanf("%s",p1->birth);
- if((len)<10)
- printf("请输入0%d的电话:",len);
- else
- printf("请输入%d的电话号:",len);
- scanf("%ld",&p1->tele);
- if((len)<10)
- printf("请输入0%d的地址:",len);
- else
- printf("请输入%d的地址:",len);
- scanf("%s",p1->addr);
- if((len)<10)
- printf("请输入0%d是否为党员:",len);
- else
- printf("请输入%d是否为党员:",len);
- scanf("%s",p1->party);
- head=NULL;
- while(strcmp(p1->num,"0")!=0)
- {
- len++;
- if(head==NULL)
- head=p1=p2;
- else
- p2->next=p1;
- p2=p1;
- p1=(struct student *) malloc(sizeof(struct student));
- if((len)<10)
- printf("请输入0%d的学号:",len);
- else
- printf("请输入%d的学号:",len);
- scanf("%s",p1->num);
- if((len)<10)
- printf("请输入0%d的姓名:",len);
- else
- printf("请输入%d的姓名:",len);
- scanf("%s",p1->name);
- if((len)<10)
- printf("请输入0%d的性别:",len);
- else
- printf("请输入%d的性别:",len);
- scanf("%s",p1->sex);
- ch=getchar();
- if((len)<10)
- printf("请输入0%d的年龄:",len);
- else
- printf("请输入%d的年龄:",len);
- scanf("%d",&p1->age);
- if((len)<10)
- printf("请输入0%d的生日:",len);
- else
- printf("请输入%d的生日:",len);
- scanf("%s",p1->birth);
- if((len)<10)
- printf("请输入0%d的电话:",len);
- else
- printf("请输入%d的电话号:",len);
- scanf("%ld",&p1->tele);
- if((len)<10)
- printf("请输入0%d的地址:",len);
- else
- printf("请输入%d的地址:",len);
- scanf("%s",p1->addr);
- if((len)<10)
- printf("请输入0%d是否为党员:",len);
- else
- printf("请输入%d是否为党员:",len);
- scanf("%s",p1->party);
- }
- p2->next=NULL;
- writetxt(head);
- return (head);
- }
- }
- if(ok=='N'||ok=='n')
- {
- printf("请重新选择/n");
- return NULL;
- }
- else
- {
- printf("/n 文件已经存在/n");
- fp=fopen("d://student.txt","rb");
- p=stud;
- for(i=0;!feof(fp);i++)
- fread(stud+i,sizeof(struct student),1,fp);
- len=i-1;
- printf(" 文件里含有%d条学生信息/n",len);
- printf("/n 是否使用已经存在的学生数据?(Y/N)/n");
- ch=getchar();
- scanf("%c",&ok);
- if(ok=='Y'||ok=='y')
- {
- head=p1=p2=NULL;
- fp=fopen("d://student.txt","rb");
- if(fp==NULL)
- {
- printf("open error/n");
- return NULL;
- }
- else
- {
- printf("学号 姓名 性别 年龄 出生年月 电话号码 地址 是否党员/n");
- for(i=0;i<len;i++)
- {
- p1=(struct student *)malloc(sizeof(struct student));
- fread(p1,sizeof(struct student),1,fp);
- if(head==NULL)
- head=p2=p1;
- else
- p2->next=p1;
- p2=p1;
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p1->num,p1->name,p1->sex,p1->age,p1->birth,p1->tele,p1->addr,p1->party);
- }
- fclose(fp);
- return(head);
- }
- }
- if(ok=='N'||ok=='n')
- {
- len=1;
- p1=p2=( struct student *) malloc(sizeof(struct student ));
- if((len)<10)
- printf("请输入0%d的学号:",len);
- else
- printf("请输入%d的学号:",len);
- scanf("%s",p1->num);
- if((len)<10)
- printf("请输入0%d的姓名:",len);
- else
- printf("请输入%d的姓名:",len);
- scanf("%s",p1->name);
- if((len)<10)
- printf("请输入0%d的性别:",len);
- else
- printf("请输入%d的性别:",len);
- scanf("%s",p1->sex);
- ch=getchar();
- if((len)<10)
- printf("请输入0%d的年龄:",len);
- else
- printf("请输入%d的年龄:",len);
- scanf("%d",&p1->age);
- if((len)<10)
- printf("请输入0%d的生日:",len);
- else
- printf("请输入%d的生日:",len);
- scanf("%s",p1->birth);
- if((len)<10)
- printf("请输入0%d的电话:",len);
- else
- printf("请输入%d的电话号:",len);
- scanf("%ld",&p1->tele);
- if((len)<10)
- printf("请输入0%d的地址:",len);
- else
- printf("请输入%d的地址:",len);
- scanf("%s",p1->addr);
- if((len)<10)
- printf("请输入0%d是否为党员:",len);
- else
- printf("请输入%d是否为党员:",len);
- scanf("%s",p1->party);
- head=NULL;
- while(strcmp(p1->num,"0")!=0)
- {
- if(head==NULL)
- head=p1=p2;
- else
- p2->next=p1;
- p2=p1;
- p1=(struct student *) malloc(sizeof(struct student));
- if((len)<10)
- printf("请输入0%d的学号:",len);
- else
- printf("请输入%d的学号:",len);
- scanf("%s",p1->num);
- if((len)<10)
- printf("请输入0%d的姓名:",len);
- else
- printf("请输入%d的姓名:",len);
- scanf("%s",p1->name);
- if((len)<10)
- printf("请输入0%d的性别:",len);
- else
- printf("请输入%d的性别:",len);
- scanf("%s",p1->sex);
- ch=getchar();
- if((len)<10)
- printf("请输入0%d的年龄:",len);
- else
- printf("请输入%d的年龄:",len);
- scanf("%d",&p1->age);
- if((len)<10)
- printf("请输入0%d的生日:",len);
- else
- printf("请输入%d的生日:",len);
- scanf("%s",p1->birth);
- if((len)<10)
- printf("请输入0%d的电话:",len);
- else
- printf("请输入%d的电话号:",len);
- scanf("%ld",&p1->tele);
- if((len)<10)
- printf("请输入0%d的地址:",len);
- else
- printf("请输入%d的地址:",len);
- scanf("%s",p1->addr);
- if((len)<10)
- printf("请输入0%d是否为党员:",len);
- else
- printf("请输入%d是否为党员:",len);
- scanf("%s",p1->party);
- }
- p2->next=NULL;
- writetxt(head);
- }
- return (head);
- }
- }
- /*学生信息的修改*/
- struct student *change(struct student *head)
- {
- struct student *p=head;
- int age,choose,m;
- long tele;
- char num[10];
- char ch,yes,sex[5],birth[20],addr[30],party[10];
- char *p1;
- if(head==NULL)
- {
- printf("原链表为空");
- return NULL;
- }
- else
- {
- while(1)
- {
- printf("请输入学号/n");
- scanf("%s",num);
- p=head;
- while(p!=NULL&&strcmp(p->num,num)!=0)
- {
- p=p->next;
- if(p==NULL)
- {
- printf("该学生不存在/n");
- break;
- }
- if(strcmp(p->name,"0")==0)
- {
- printf("该学生已不存在/n");
- break;
- }
- }
- m=0;
- while(1)
- {
- if(p==NULL)
- break;
- if(strcmp(p->name,"0")==0)
- break;
- printf("请选择1.性别 2.年龄 3.出生日期4.电话 5.家庭住址6.党员/n");
- scanf("%d",&choose);
- if(choose==1)
- {
- printf("请输入新的性别:/n");
- scanf("%s",&sex);
- p1=sex;
- strcpy(p->sex,p1);
- printf("是否继续修改本学生学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- if(choose==2)
- {
- printf("请输入新的年龄:/n");
- scanf("%d",&age);
- p->age=age;
- printf("是否继续修改本学生学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- if(choose==3)
- {
- printf("请输入新的出生日期:/n");
- scanf("%s",birth);
- p1=birth;
- strcpy(p->birth,p1);
- printf("是否继续修改本学生学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- if(choose==4)
- {
- printf("请输入新的电话:/n");
- scanf("%d",&tele);
- p->tele=tele;
- printf("是否继续修改本学生学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- if(choose==5)
- {
- printf("请输入新的家庭住址:/n");
- scanf("%s",addr);
- p1=addr;
- strcpy(p->addr,p1);
- printf("是否继续修改本学生学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- if(choose==6)
- {
- printf("请输入'是'或'否':/n");
- scanf("%s",party);
- p1=party;
- strcpy(p->party,p1);
- printf("是否继续修改本学生学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- }
- printf("是否继续修改其他学生Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- }
- writetxt(head);
- p=head;
- while(p!=NULL)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p->num,p->name,p->sex,p->age,p->birth,p->tele,p->addr,p->party);
- p=p->next;
- }
- return head;
- }
- }
- /
- /*学生成绩信息的录入*/
- /
- struct student *chengji(struct student *head)
- {
- FILE *fp;
- struct student *p1,*p;
- int i;
- float sum=0;
- fp=fopen("d://student1.txt","wb");
- p1=(struct student *)malloc(sizeof(struct student));
- p1=head;
- while(p1!=NULL)
- {
- if(strcmp(p1->name,"0")==0)
- {
- printf("该学生不存在/n");
- p1=p1->next;
- continue;
- }
- printf("请输入学号为%s学生的高数、C语言、英语成绩:/n",p1->num);
- for(i=0;i<M;i++)
- {
- scanf("%f",&p1->score[i]);
- sum+=p1->score[i];
- }
- p1->total=sum;
- sum=0;
- fwrite(p1,sizeof(struct student),1,fp);
- p1=p1->next;
- }
- fclose(fp);
- writetxt(head);
- p=head;
- printf("学号 姓名 性别 年龄 出生年月 电话号码 地址 是否党员/n");
- while(p!=NULL)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p->num,p->name,p->sex,p->age,p->birth,p->tele,p->addr,p->party);
- p=p->next;
- }
- return(head);
- }
- /
- /*学生信息的添加*/
- /
- struct student *insert(struct student *head)
- {
- char ch,ok;
- struct student *p,*p0,*p1;
- p=p1=head;
- while(1)
- {
- if((len+1)<10)
- printf("您的学号为0%d/n",len+1);
- else
- printf("您的学号为%d/n",len+1);
- p0=(struct student *)malloc(sizeof(struct student));
- len++;
- if((len)<10)
- printf("请输入0%d的学号:",len);
- else
- printf("请输入%d的学号:",len);
- scanf("%s",p0->num);
- if((len)<10)
- printf("请输入0%d的姓名:",len);
- else
- printf("请输入%d的姓名:",len);
- scanf("%s",p0->name);
- if((len)<10)
- printf("请输入0%d的性别:",len);
- else
- printf("请输入%d的性别:",len);
- scanf("%s",p0->sex);
- ch=getchar();
- if((len)<10)
- printf("请输入0%d的年龄:",len);
- else
- printf("请输入%d的年龄:",len);
- scanf("%d",&p0->age);
- if((len)<10)
- printf("请输入0%d的生日:",len);
- else
- printf("请输入%d的生日:",len);
- scanf("%s",p0->birth);
- if((len)<10)
- printf("请输入0%d的电话:",len);
- else
- printf("请输入%d的电话号:",len);
- scanf("%ld",&p0->tele);
- if((len)<10)
- printf("请输入0%d的地址:",len);
- else
- printf("请输入%d的地址:",len);
- scanf("%s",p0->addr);
- if((len)<10)
- printf("请输入0%d是否为党员:",len);
- else
- printf("请输入%d是否为党员:",len);
- scanf("%s",p0->party);
- while(p->next!=NULL)
- p=p->next;
- p->next=p0;
- p0->next=NULL;
- printf("是否继续添加Y/N/n") ;
- ch=getchar();
- scanf("%c",&ok);
- if(ok=='y'||ok=='Y')len++;
- else
- {
- printf("您需要重新进行1的操作来完成该学生信息的注册,谢谢!/n");
- break;
- }
- }
- p=head;
- while(p!=NULL)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p->num,p->name,p->sex,p->age,p->birth,p->tele,p->addr,p->party);
- p=p->next;
- }
- writetxt(head);
- return(head);
- }
- /
- /* 恢复误删的学生信息*/
- /
- struct student *recover(struct student *head)
- {
- FILE *fp;
- struct student *p1,*p;
- p=p1=(struct student*)malloc(sizeof(struct student));
- char ch;
- char num[10];
- p1=head;
- printf("input the recover number:");
- scanf("%s",num);
- fp=fopen("d://recycle.txt","rb");
- if(fp==NULL)
- {
- printf("回收站为空!/n");
- return NULL;
- }
- else
- {
- printf("是否将回收站的数据还原?Y/N /n");
- ch=getchar();
- ch=getchar();
- if(ch=='n'||ch=='N')
- printf("不需要还原!");
- else
- {
- while(1)
- {
- if(strcmp(p1->num,num)==0)
- break;
- else
- p1=p1->next;
- }
- while(!feof(fp))
- {
- fread(p,sizeof(struct student),1,fp);
- if(strcmp(p1->num,p->num)==0)
- {
- strcpy(p1->name,p->name);
- strcpy(p1->sex,p->sex);
- p1->age=p->age;
- strcpy(p1->birth,p->birth);
- p1->tele=p->tele;
- strcpy(p1->addr,p->addr);
- strcpy(p1->party,p->party);
- printf("dddddddddddddddddddd/n");
- break;
- }
- }
- }
- writetxt(head);
- p=head;
- while(p!=NULL)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p->num,p->name,p->sex,p->age,p->birth,p->tele,p->addr,p->party);
- p=p->next;
- }fclose(fp);
- }
- return head;
- }
- /
- /* 学生信息的删除*/
- /
- struct student *del(struct student *head)
- {
- FILE *fp;
- struct student *p1,*p2,*p0;
- p1=p2=head;
- char ch;
- char num[10];
- printf("input the delete number:");
- scanf("%s",num);
- if(head==NULL)
- printf("nothing to delete!");
- else
- {
- while(p1!=NULL)
- {
- if(strcmp(p1->num,num)!=0)
- {
- p2=p1;
- p1=p1->next;
- }
- if(strcmp(p1->num,num)==0)
- {
- p0=p1;
- printf("是否永久删除该学生的信息?Y/N /n");
- ch=getchar();
- ch=getchar();
- if(ch=='y'||ch=='Y')
- {
- printf("该学生信息已经成功从磁盘删除!/n");
- if(p1==head)
- {
- p0=p1;
- head=p1->next;
- p1=p2=head;
- p1=p2->next;
- }
- else
- {
- p0=p1;
- p2->next=p1->next;
- p1=p2->next;
- }
- break;
- }
- else
- {
- fp=fopen("d://recycle.txt","ab+");
- if(fp==NULL)
- {
- printf("cannot open the file!");
- return NULL;
- }
- fwrite(p0,sizeof(struct student),1,fp);
- strcpy(p1->name,"0");
- strcpy(p1->sex,"0");
- p1->age=0;
- strcpy(p1->birth,"0");
- p1->tele=0;
- strcpy(p1->addr,"0");
- strcpy(p1->party,"0");
- printf("学生信息已放入回收站!/n");
- fclose(fp);
- printf("如果想恢复刚刚删除的学生信息,请输入'Y'or'y'/n");
- printf("如果不想恢复刚刚删除的学生信息,请输入'N'or'n'/n");
- ch=getchar();
- ch=getchar();
- if(ch=='y'||ch=='Y')
- {
- head=recover(head);
- break;
- }
- if(ch=='n'||ch=='N')
- break ;
- }
- }
- }
- }
- writetxt(head);
- return head;
- }
- /
- /* 密码修改保存函数*/
- void write()
- {
- FILE *fp;
- struct secret p;
- int i;
- fp=fopen("d://mima.txt","wb");
- if(fp==NULL)
- {
- printf("cannot open!");
- }
- for(i=0;i<=len;i++)
- {
- p=use[i];
- fwrite(&p,sizeof(struct secret),1,fp);
- }
- fclose(fp);
- }
- /*学生信息的查询*/
- void research(struct student *head)
- {
- struct student *p1,*p2;
- p1=p2=head;
- int i,j,l=1,k=0;
- char sex[20],party[10],ch,yes;
- int age;
- char num[10],name[20];
- printf("选择:1.模糊查询 2.精确查询:");
- scanf("%d",&i);
- if(i==1)
- {
- while(l==1)
- {
- printf("选择:1.性别 2.年龄 3.是否党员:");
- scanf("%d",&j);
- if(j==1)
- { p1=head;
- printf("输入性别:");
- scanf("%s",sex);
- ch=getchar();
- while(p1!=NULL)
- {
- if(strcmp(p1->sex,sex)==0)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p1->num,p1->name,p1->sex,p1->age,p1->birth,p1->tele,p1->addr,p1->party);
- p1=p1->next;
- continue;
- }
- k++;
- if(k==3)
- printf("该学生不存在!/n");
- p1=p1->next;
- }
- printf("是否继续查询学生其他信息Y/N/n");
- scanf("%c",&yes);
- printf("yes=%c/n",yes);
- if(yes=='N'||yes=='n')
- break;
- if(yes=='Y'||yes=='y')
- k=0;
- }
- if(j==2)
- {
- p1=head;
- printf("输入年龄:");
- scanf("%d",&age);
- while(p1!=NULL)
- {
- if(p1->age==age)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p1->num,p1->name,p1->sex,p1->age,p1->birth,p1->tele,p1->addr,p1->party);
- p1=p1->next;
- continue;
- }
- k++;
- if(k==3)
- printf("该学生不存在!/n");
- p1=p1->next;
- }
- printf("是否继续查询学生其他信息Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- if(yes=='Y'||yes=='y')
- k=0;
- }
- if(j==3)
- {
- p1=head;
- printf("输入是否党员:");
- scanf("%s",party);
- ch=getchar();
- while(p1!=NULL)
- {
- if(strcmp(p1->party,party)==0)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p1->num,p1->name,p1->sex,p1->age,p1->birth,p1->tele,p1->addr,p1->party);
- p1=p1->next;
- continue;
- }
- k++;
- if(k==3)
- printf("该学生不存在!/n");
- p1=p1->next;
- }
- printf("是否继续查询学生其他信息?Y/N/n");
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- if(yes=='Y'||yes=='y')
- k=0;
- }
- }
- }
- if(i==2)
- {
- printf("请选择细查的关键字:1.学生学号 2.学生姓名:");
- scanf("%d",&j);
- if(j==1)
- {
- while(1)
- {
- p1=head;
- printf("输入学生的学号:");
- scanf("%5s",num);
- while(p1!=NULL)
- {
- if(strcmp(p1->num,num)==0)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p1->num,p1->name,p1->sex,p1->age,p1->birth,p1->tele,p1->addr,p1->party);
- p1=p1->next;continue;
- }
- k++;
- if(k==3)
- printf("该学生不存在!/n");
- p1=p1->next;
- }
- printf("是否继续查询其他学生信息?Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- if(yes=='Y'||yes=='y')
- k=0;
- }
- }
- if(j==2)
- {
- while(1)
- {
- p1=head;
- printf("输入学生的名字:");
- scanf("%s",name);
- while(p1!=NULL)
- {
- if(strcmp(p1->name,name)==0)
- {
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",p1->num,p1->name,p1->sex,p1->age,p1->birth,p1->tele,p1->addr,p1->party);
- p1=p1->next;continue;
- }
- k++;
- if(k==3)
- printf("该学生不存在!/n");
- p1=p1->next;
- }
- printf("是否继续查询其他学生信息?Y/N/n");
- ch=getchar();
- scanf("%c",&yes);
- if(yes=='N'||yes=='n')
- break;
- if(yes=='Y'||yes=='y')
- k=0;
- }
- }
- }
- }
- /
- void research1(char num[])
- {
- int i;
- for(i=0;i<=len;i++)
- if(strcmp(stud[i].num,num)==0)
- printf("%2s%15s%10s%10d%15s%8ld%10s%8s/n",stud[i].num,stud[i].name,stud[i].sex,stud[i].age,stud[i].birth,stud[i].tele,stud[i].addr,stud[i].party);
- }
- /
- /* 密码修改函数-*/
- void mimacli()
- {
- char use1[30],mima[30],newmima[30],ch;
- int i,j=0;
- printf("输入用户名:/n");
- scanf("%s",use1);
- printf("输入密码:/n");
- while(1)
- {
- mima[j]=getch();
- if(mima[j]==13)
- break;
- putchar('*');
- j++;
- }
- mima[j]='/0';
- printf("/n");
- for(i=0;i<=len;i++)
- {
- if(strcmp(stud[i].name,"0")==0)
- {
- printf("该学生不存在/n");
- continue;
- }
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)==0)
- {
- printf("输入新密码:/n");
- ch=getchar();
- j=0;
- while(1)
- {
- newmima[j]=getch();
- if(newmima[j]==13)
- break;
- putchar('*');
- j++;
- }
- newmima[j]='/0';
- printf("/n");
- strcpy(use[i].code,newmima);
- write();
- for(i=0;i<=len;i++){
- printf("///n");
- printf("%s ",use[0].user);
- printf("%s/n",use[0].code);
- printf("///n");}
- break;
- }
- if(strcmp(use1,use[1].user)<0||strcmp(use1,use[len].user)>0)
- {
- printf("**************************************/n");
- printf(" 4用户名错误 /n");
- printf("***************************************/n");
- break;
- }
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- break;
- }
- }
- }
- /
- /* 学生信息管理系统的菜单函数-系统函数*/
- int menu()
- {
- int sn,i,j=0;
- char use1[30];
- char mima[30];
- int m=0;
- printf(" 学生信息管理系统/n");
- printf("=========================================/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("==========================================/n");
- printf("请选择0-8:/n");
- while(1)
- {
- scanf("%d",&sn);
- if(sn==7)
- for(i=1;i<=len;i++)
- {
- strcpy(use[i].user,stud[i-1].num );
- strcpy(use[i].code,stud[i-1].num );
- }
- if(sn>1&&sn<7||sn==8)
- {
- printf("请输入您的用户名:");
- scanf("%s",use1);
- printf("请输入您的密码:");
- while(1)
- {
- mima[j]=getch();
- if(mima[j]==13)
- break;
- putchar('*');
- j++;
- }
- mima[j]='/0';
- printf("/n");
- if(sn==6)
- if(strcmp(use1,use[0].user)!=0)
- {
- for(i=0;i<=len;i++)
- {
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)==0)
- {
- if(i!=0)
- {
- printf("**************************************/n");
- printf(" 您只能查找您本人的信息 /n");
- printf("***************************************/n");
- research1(use1);
- break;
- }
- }
- if(strcmp(use1,use[0].user)==0&&strcmp(use[0].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- while(1)
- {
- m++;
- if(m<3)
- {
- printf("重新输入:/n");
- printf("请输入您的用户名:");
- scanf("%s",use1);
- printf("请输入您的密码:");
- j=0;
- while(1)
- {
- mima[j]=getch();
- if(mima[j]==13)
- break;
- putchar('*');
- j++;
- }
- mima[j]='/0';
- if(strcmp(use1,use[0].user)==0&&strcmp(use[0].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- }
- }
- else
- {
- sn=0;
- break;
- }
- }
- sn=0;
- break;
- }
- if(strcmp(use1,use[1].user)<0||strcmp(use1,use[len].user)>0)
- {
- printf("**************************************/n");
- printf(" 3用户名错误 /n");
- printf("***************************************/n");
- sn=0;
- break;
- }
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- while(1)
- {
- m++;
- if(m<3)
- {
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)==0)
- {
- printf("**************************************/n");
- printf(" 您没有权限来操作 /n");
- printf("***************************************/n");
- sn=0;
- break;
- }
- printf("重新输入:/n");
- printf("请输入您的用户名:");
- scanf("%s",use1);
- printf("请输入您的密码:");
- j=0;
- while(1)
- {
- mima[j]=getch();
- if(mima[j]==13)
- break;
- putchar('*');
- j++;
- }
- mima[j]='/0';
- printf("/n");
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- }
- else
- {
- printf("**************************************/n");
- printf(" 欢迎您登陆本系统 /n");
- printf("***************************************/n");
- research1(use1);
- break;
- }
- }
- else
- {
- sn=0;
- break;
- }
- }
- }
- }
- }
- for(i=0;i<=len;i++)
- {
- if(sn==6)
- if(strcmp(use1,use[0].user)!=0)
- {
- sn=0;
- break;
- }
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)==0)
- {
- if(i!=0)
- {
- printf("**************************************/n");
- printf(" 您没有权限来操作 /n");
- printf("***************************************/n");
- sn=0;
- break;
- }
- else
- {
- printf("**************************************/n");
- printf(" 欢迎您登陆本系统 /n");
- printf("***************************************/n");
- break;
- }
- }
- if(strcmp(use1,use[0].user)==0&&strcmp(use[0].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- while(1)
- {
- m++;
- if(m<3)
- {
- printf("重新输入:/n");
- printf("请输入您的用户名:");
- scanf("%s",use1);
- printf("请输入您的密码:");
- j=0;
- while(1)
- {
- mima[j]=getch();
- if(mima[j]==13)
- break;
- putchar('*');
- j++;
- }
- mima[j]='/0';
- printf("/n");
- if(strcmp(use1,use[0].user)==0&&strcmp(use[0].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- }
- else
- {
- printf("**************************************/n");
- printf(" 欢迎您登陆本系统 /n");
- printf("***************************************/n");
- break;
- }
- }
- else
- {
- sn=0;
- break;
- }
- }
- break;
- }
- if(strcmp(use1,use[1].user)<0||strcmp(use1,use[len].user)>0)
- {
- printf("**************************************/n");
- printf(" 用户名错误 /n");
- printf("***************************************/n");
- sn=0;
- break;
- }
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- while(1)
- {
- m++;
- if(m<3)
- {
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)==0)
- {
- printf("**************************************/n");
- printf(" 您没有权限来操作 /n");
- printf("***************************************/n");
- sn=0;
- break;
- }
- printf("重新输入:/n");
- printf("请输入您的用户名:");
- scanf("%s",use1);
- printf("请输入您的密码:");
- j=0;
- while(1)
- {
- mima[j]=getch();
- if(mima[j]==13)
- break;
- putchar('*');
- j++;
- }
- mima[j]='/0';
- printf("/n");
- if(strcmp(use1,use[i].user)==0&&strcmp(use[i].code,mima)!=0)
- {
- printf("**************************************/n");
- printf(" 密码错误 /n");
- printf("***************************************/n");
- }
- }
- else
- {
- sn=0;
- break;
- }
- }
- }
- }
- }
- if (sn<0 || sn>8)
- {
- printf("/n/t输入错误,重选0-8/n");
- break;
- }
- else
- break;
- }
- return sn;
- }
- /
- /* 学生信息管理系统的主函数--系统函数*/
- /
- void main()
- {
- struct student *head;
- int i,j=0;
- while(1)
- {
- switch(menu())
- {
- case 1:
- printf("**************************************/n");
- printf(" 学生信息的整体注册 /n");
- printf("***************************************/n");
- head=create();
- FILE *fp;
- struct secret p;
- fp=fopen("d://mima.txt","rb");
- if(fp==NULL)
- printf("open error/n");
- else
- {
- for(i=0;i<=len;i++)
- {
- fread(&p,sizeof(struct secret),1,fp);
- strcpy(use[i].user,p.user);
- strcpy(use[i].code,p.code);
- }
- fclose(fp);
- }
- break;
- case 2:
- printf("**************************************/n");
- printf("学生信息的修改/n");
- printf("**************************************/n");
- change(head);
- break;
- case 3:
- printf("**************************************/n");
- printf("学生信息的添加/n");
- printf("**************************************/n");
- head=insert(head);
- break;
- case 4:
- printf("**************************************/n");
- printf("学生成绩信息的删除入/n");
- printf("**************************************/n");
- head=del(head);
- break;
- case 5:
- printf("**************************************/n");
- printf("学生成绩信息的录入/n");
- printf("**************************************/n");
- head=chengji(head);
- break;
- case 6:
- printf("**************************************/n");
- printf("学生信息的查询/n");
- printf("**************************************/n");
- research(head);
- break;
- case 7:
- printf("**************************************/n");
- printf("访问者密码的修改/n");
- printf("**************************************/n");
- mimacli();
- break;
- case 8:
- printf("**************************************/n");
- printf("恢复误删信息/n");
- printf("**************************************/n");
- recover(head);
- break;
- case 0:
- printf("**************************************/n");
- printf("退出学生信息管理系统/n");
- printf("**************************************/n");
- printf("The end./n");
- return;
- default: printf("/n选择错误,请重选!/n");
- getchar();
- getchar();
- }
- system("cls");
- }
- }
- 2、用静态链表实现:
- 设计一个学生信息管理系统,链表中每一结点包括:学号、姓名、年龄、性别、出生年月、地址、电话、电子邮件。程序能实现以下功能:
从文件中加载信息
从键盘输入信息显示学生的信息
修改学生的信息
查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示“无此记录!”的信息。
删除链表中指定学号的结点。
添加学生记录
要求:程序运行中,先显示实现以上功能所构成的菜单,然后根据选项调用相应程序及显示其对应的结果。完整的代码如下:
- #include "stdlib.h"
- #include "string.h"
- typedef struct student
- {
- int id; //学号
- char name[20]; //姓名
- int age; //年龄
- char sex; //性别(f或m)
- char birthday[30]; //出生年月
- char address[20]; //地址
- char phone[15]; //电话
- char email[30]; //email
- struct student *next;
- }student;
- student *head=NULL;
- int length; //链表的长度
- void create()
- {
- student *p1,*p2;
- length=0;
- p1=(student *)malloc(sizeof(student));
- p1->id=-1;
- if(head==NULL)
- head=p1;
- printf("请输入学生的学号、姓名、年龄、性别、出生年月、地址、电话、电子邮箱:/n");
- while(1) //学号为0的时候退出
- {
- p2=(student *)malloc(sizeof(student));
- scanf("%d %s %d %c %s %s %s %s",&p2->id,p2->name,&p2->age,&p2->sex,p2->birthday,p2->address,p2->phone,p2->email); //输入学生信息
- if(p2->id==0)
- {
- printf("链表创建完成!/n");
- break;
- }
- length++; //链表的长度
- p1->next=p2;
- p2->next=NULL;
- p1=p1->next;
- }
- return ;
- }
- void LoadStudentInfoFromFile()
- {
- student *p,*q;
- int c;
- FILE* f;
- f= fopen("input.txt","r");
- if (f == NULL)
- return;
- fseek(f, 0, SEEK_SET);
- p=(student *)malloc(sizeof(student));
- p->next=NULL;
- head=p;
- while(!feof(f))
- {
- c = fgetc(f);
- if (c != -1)
- fseek(f, -1, SEEK_CUR);
- else
- return ;
- q=(student *)malloc(sizeof(student));
- fscanf(f,"%d",&q->id);
- fscanf(f,"%s",q->name);
- fscanf(f,"%d",&q->age);
- fscanf(f,"%c",&q->sex);
- fscanf(f,"%c",&q->sex);
- fscanf(f,"%s",q->birthday);
- fscanf(f,"%s",q->address);
- fscanf(f,"%s",q->phone);
- fscanf(f,"%s",q->email);
- q->next=NULL;
- p->next=q;
- p=p->next;
- length++; //链表的长度
- }
- }
- void ModifyStudentInfo()
- {
- student *p=head->next;
- int num;
- printf("请输入要修改的学生的学号:");
- scanf("%d",&num);
- while(p!=NULL)
- {
- if(p->id==num)
- {
- printf("修改前,学号为%d的学生的信息如下:/n",num);
- printf("%d %s %d %c %s %s %s %s/n",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
- printf("请输入学生的新电话:");
- getchar();
- gets(p->phone);
- printf("请输入学生的新地址:");
- gets(p->address);
- printf("修改后,学号为%d的学生的信息如下:/n",num);
- printf("%d %s %d %c %s %s %s %s/n",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
- return ;
- }
- p=p->next;
- }
- if(p==NULL)
- {
- printf("该学号不存在!/n");
- return ;
- }
- }
- void display()
- {
- student *p=head->next;
- printf("链表中所有的学生信息如下:/n");
- while(p!=NULL)
- {
- printf("%d %s %d %c %s %s %s %s/n",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
- //printf("/n");
- p=p->next;
- }
- return ;
- }
- void search()
- {
- int num,x;
- char name[20];
- student *p=head->next;
- printf("请选择查询的方式:/n");
- printf("1、按学号查询/t 2、按姓名查询/n");
- scanf("%d",&x);
- if(x==1)
- {
- printf("需要查找的学生学号为:");
- scanf("%d",&num);
- while(p!=NULL)
- {
- if(p->id==num)
- {
- printf("学生学号为%d的学生的信息如下:/n",num);
- printf("%d %s %d %c %s %s %s %s/n",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
- return;
- }
- p=p->next;
- }
- if(p==NULL)
- printf("无此记录!/n");
- }
- else if(x==2)
- {
- printf("需要查找的学生姓名为:");
- getchar();
- gets(name);
- //scanf();
- p=head->next;
- while(p!=NULL)
- {
- if(strcmp(p->name,name)==0)
- {
- printf("学生姓名为%s的学生的信息如下:/n",name);
- printf("%d %s %d %c %s %s %s %s/n",p->id,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->email);
- return;
- }
- p=p->next;
- }
- if(p==NULL)
- printf("无此记录!/n");
- }
- return ;
- }
- void insert()
- {
- int num,i;
- student *p,*q;
- p=head;
- printf("请输入你要插入位置: ");
- scanf("%d",&num);
- if(num>length)
- {
- printf("找不到要插入的位置/n");
- return ;
- }
- else
- {
- printf("请输入你要插入的学生的信息:/n");
- q=(student *)malloc(sizeof(student));
- scanf("%d %s %d %c %s %s %s %s",&q->id,q->name,&q->age,&q->sex,q->birthday,q->address,q->phone,q->phone);
- while(p!=NULL)
- {
- if(p->id==q->id)
- {
- printf("该学号已经存在,无法插入!/n");
- return ;
- }
- p=p->next;
- }
- p=head;
- for(i=0;i<num;i++)
- p=p->next;
- q->next=p->next;
- p->next=q;
- length++;
- printf("插入成功!/n");
- return ;
- }
- }
- void Delete()
- {
- int num;
- student *p,*q;
- q=head,p=head->next;
- printf("请输入要删除的学生的学号:/n");
- scanf("%d",&num);
- while(p!=NULL)
- {
- if(p->id==num)
- {
- q->next=p->next;
- free(p);
- length--;
- printf("删除成功!/n");
- return ;
- }
- p=p->next;
- q=q->next;
- }
- if(p==NULL)
- {
- printf("找不到要删除的编号!/n");
- return ;
- }
- }
- void menu()
- {
- printf("________________________________________________________________/n");
- printf("| 学生信息管理系统 |/n");
- printf("| 0、 退出系统 |/n");
- printf("| 1、 录入学生信息 |/n");
- printf("| 2、 建立链表 |/n");
- printf("| 3、 显示链表 |/n");
- printf("| 4、 查找链表中的某个元素 |/n");
- printf("| 5、 删除链表中指定学号的结点 |/n");
- printf("| 6、 指定的位置上插入一个新结点 |/n");
- printf("| 7、 修改学生信息 |/n");
- printf("________________________________________________________________/n");
- return ;
- }
- int main(void)
- {
- int a;
- menu();
- while(1)
- {
- printf("请选择相应的功能:");
- scanf("%d",&a);
- switch(a)
- {
- case 0:
- return 0;
- case 1:
- LoadStudentInfoFromFile(); //从文件中加载学生信息
- menu();
- break;
- case 2:
- create(); //从键盘输入学生信息
- menu();
- break;
- case 3:
- if(head)
- {
- display();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!/n");
- menu();
- }
- break;
- case 4:
- if(head)
- {
- search();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!/n");
- menu();
- }
- break;
- case 5:
- if(head)
- {
- Delete();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!/n");
- menu();
- }
- break;
- case 6:
- if(head)
- {
- insert();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!/n");
- menu();
- }
- break;
- case 7:
- if(head)
- {
- ModifyStudentInfo();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!/n");
- menu();
- }
- break;
- default:
- break;
- }
- }
- system("pause");
- return 0;
- }
3、动态链表实现:
-
1、 建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。程序能实现以下功能:
建立链表
显示链表
查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示“无此记录!”的信息。
删除链表中指定学号的结点。
在链表中指定的位置插入一个新结点(学号不能和其他结点重复)。
要求:程序运行中,先显示实现以上功能所构成的菜单,然后根据选项调用相应程序及显示其对应的结果,然后再显示菜单程序,直到按“退出”选项,程序执行结束。完整的代码如下:
- #include "stdio.h"
- #include "stdlib.h"
- typedef struct student
- {
- int id; //学号
- char name[20]; //姓名
- char sex; //性别(f或m)
- int age; //年龄
- int score; //成绩
- struct student *next;
- }student;
- student *head=NULL;
- int length; //链表的长度
- void create()
- {
- student *p1,*p2;
- length=0;
- p1=(student *)malloc(sizeof(student));
- p1->id=-1;
- if(head==NULL)
- head=p1;
- printf("请输入学生的学号、姓名、性别、年龄、成绩信息:\n");
- while(1) //学号为0的时候退出
- {
- p2=(student *)malloc(sizeof(student));
- scanf("%d %s %c %d %d",&p2->id,p2->name,&p2->sex,&p2->age,&p2->score); //输入学生信息
- if(p2->id==0)
- {
- printf("链表创建完成!\n");
- break;
- }
- length++; //链表的长度
- p1->next=p2;
- p2->next=NULL;
- p1=p1->next;
- }
- return ;
- }
- void display()
- {
- student *p=head->next;
- printf("链表中所有的学生信息如下:\n");
- while(p!=NULL)
- {
- printf("%d %s %c %d %d\n",p->id,p->name,p->sex,p->age,p->score);
- p=p->next;
- }
- return ;
- }
- void search()
- {
- int num;
- student *p=head->next;
- printf("需要查找的学生学号为:");
- scanf("%d",&num);
- while(p!=NULL)
- {
- if(p->id==num)
- {
- printf("学号为%d的学生的信息如下:\n",num);
- printf("%d %s %c %d %d\n",p->id,p->name,p->sex,p->age,p->score);
- return;
- }
- p=p->next;
- }
- if(p==NULL)
- printf("无此记录!\n");
- return ;
- }
- void insert()
- {
- int num,i;
- student *p,*q;
- p=head;
- printf("请输入你要插入位置: ");
- scanf("%d",&num);
- if(num>length)
- {
- printf("找不到要插入的位置\n");
- return ;
- }
- else
- {
- printf("请输入你要插入的学生的学号、姓名、性别、年龄、成绩信息:\n");
- q=(student *)malloc(sizeof(student));
- scanf("%d %s %c %d %d",&q->id,q->name,&q->sex,&q->age,&q->score);
- while(p!=NULL)
- {
- if(p->id==q->id)
- {
- printf("该学号已经存在,无法插入!\n");
- return ;
- }
- p=p->next;
- }
- p=head;
- for(i=0;i<num;i++)
- p=p->next;
- q->next=p->next;
- p->next=q;
- length++;
- printf("插入成功!\n");
- return ;
- }
- }
- void Delete()
- {
- int num;
- student *p,*q;
- q=head,p=head->next;
- printf("请输入要删除的学生的学号:\n");
- scanf("%d",&num);
- while(p!=NULL)
- {
- if(p->id==num)
- {
- q->next=p->next;
- free(p);
- length--;
- printf("删除成功!\n");
- return ;
- }
- p=p->next;
- q=q->next;
- }
- if(p==NULL)
- {
- printf("找不到要删除的编号!\n");
- return ;
- }
- }
- void menu()
- {
- printf("________________________________________________________________\n");
- printf("| 学生信息管理系统 |\n");
- printf("| 0、 退出系统 |\n");
- printf("| 1、 建立链表 |\n");
- printf("| 2、 显示链表 |\n");
- printf("| 3、 查找链表中的某个元素 |\n");
- printf("| 4、 删除链表中指定学号的结点 |\n");
- printf("| 5、 指定的位置上插入一个新结点 |\n");
- printf("________________________________________________________________\n");
- return ;
- }
- int main(void)
- {
- int a;
- menu();
- while(1)
- {
- printf("请选择相应的功能:");
- scanf("%d",&a);
- switch(a)
- {
- case 0:
- return 0;
- case 1:
- create();
- menu();
- break;
- case 2:
- if(head)
- {
- display();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!\n");
- menu();
- }
- break;
- case 3:
- if(head)
- {
- search();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!\n");
- menu();
- }
- break;
- case 4:
- if(head)
- {
- Delete();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!\n");
- menu();
- }
- break;
- case 5:
- if(head)
- {
- insert();
- menu();
- }
- else
- {
- printf("链表为空,请先建立链表!\n");
- menu();
- }
- break;
- default:
- break;
- }
- }
- system("pause");
- return 0;
- }
#include "stdio.h" #include "stdlib.h" typedef struct student { int id; //学号 char name[20]; //姓名 char sex; //性别(f或m) int age; //年龄 int score; //成绩 struct student *next; }student; student *head=NULL; int length; //链表的长度 void create() { student *p1,*p2; length=0; p1=(student *)malloc(sizeof(student)); p1->id=-1; if(head==NULL) head=p1; printf("请输入学生的学号、姓名、性别、年龄、成绩信息:\n"); while(1) //学号为0的时候退出 { p2=(student *)malloc(sizeof(student)); scanf("%d %s %c %d %d",&p2->id,p2->name,&p2->sex,&p2->age,&p2->score); //输入学生信息 if(p2->id==0) { printf("链表创建完成!\n"); break; } length++; //链表的长度 p1->next=p2; p2->next=NULL; p1=p1->next; } return ; } void display() { student *p=head->next; printf("链表中所有的学生信息如下:\n"); while(p!=NULL) { printf("%d %s %c %d %d\n",p->id,p->name,p->sex,p->age,p->score); p=p->next; } return ; } void search() { int num; student *p=head->next; printf("需要查找的学生学号为:"); scanf("%d",&num); while(p!=NULL) { if(p->id==num) { printf("学号为%d的学生的信息如下:\n",num); printf("%d %s %c %d %d\n",p->id,p->name,p->sex,p->age,p->score); return; } p=p->next; } if(p==NULL) printf("无此记录!\n"); return ; } void insert() { int num,i; student *p,*q; p=head; printf("请输入你要插入位置: "); scanf("%d",&num); if(num>length) { printf("找不到要插入的位置\n"); return ; } else { printf("请输入你要插入的学生的学号、姓名、性别、年龄、成绩信息:\n"); q=(student *)malloc(sizeof(student)); scanf("%d %s %c %d %d",&q->id,q->name,&q->sex,&q->age,&q->score); while(p!=NULL) { if(p->id==q->id) { printf("该学号已经存在,无法插入!\n"); return ; } p=p->next; } p=head; for(i=0;i<num;i++) p=p->next; q->next=p->next; p->next=q; length++; printf("插入成功!\n"); return ; } } void Delete() { int num; student *p,*q; q=head,p=head->next; printf("请输入要删除的学生的学号:\n"); scanf("%d",&num); while(p!=NULL) { if(p->id==num) { q->next=p->next; free(p); length--; printf("删除成功!\n"); return ; } p=p->next; q=q->next; } if(p==NULL) { printf("找不到要删除的编号!\n"); return ; } } void menu() { printf("________________________________________________________________\n"); printf("| 学生信息管理系统 |\n"); printf("| 0、 退出系统 |\n"); printf("| 1、 建立链表 |\n"); printf("| 2、 显示链表 |\n"); printf("| 3、 查找链表中的某个元素 |\n"); printf("| 4、 删除链表中指定学号的结点 |\n"); printf("| 5、 指定的位置上插入一个新结点 |\n"); printf("________________________________________________________________\n"); return ; } int main(void) { int a; menu(); while(1) { printf("请选择相应的功能:"); scanf("%d",&a); switch(a) { case 0: return 0; case 1: create(); menu(); break; case 2: if(head) { display(); menu(); } else { printf("链表为空,请先建立链表!\n"); menu(); } break; case 3: if(head) { search(); menu(); } else { printf("链表为空,请先建立链表!\n"); menu(); } break; case 4: if(head) { Delete(); menu(); } else { printf("链表为空,请先建立链表!\n"); menu(); } break; case 5: if(head) { insert(); menu(); } else { printf("链表为空,请先建立链表!\n"); menu(); } break; default: break; } } system("pause"); return 0; }
程序说明:加入已经加入了4个学生信息head->liuwei->zhanghua->lina->liuxiang,链表的长度为4,插入的时候,输入4,将会在liuxiang的后面插入一个学生信息;输入1,将会在liuwei的后面插入一个学生信息;