学生信息录入小程序,大家都来帮忙看看哈!!!
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
struct student
{
long num; //索引,具有唯一标识不允许重复!!!
char name[20];
char sex[10];
char brith[15];
char remark[30];
struct student *next;
};
struct student *creat(void)//创建n个同学的链表,以输入NUM==0结束!!!
{
struct student *p1, *p2;
struct student *head=NULL;
int m=0;
long n;
for( ; ; )
{
p1=(struct student *)malloc(sizeof(struct student));
printf(" num:");
scanf("%ld",&n);
if(n==0)
{
p2->next=NULL;
return head;
}
p1->num=n;
printf(" name:");
scanf("%s",&p1->name);
printf(" sex:");
scanf("%s",&p1->sex);
printf(" brith:");
scanf("%s",&p1->brith);
printf(" remark:");
scanf("%s",&p1->remark);
if(m==0)
{
head=p1;
}
else
p2->next=p1;
p2=p1;
m++;
}
return head;
}
struct student *search1(long num,char *name,struct student *h)//查询返回该num所在地址!
{
struct student *p1;
int n=1;
p1=h;
for(;p1!=NULL;)
{
if(p1->num==num||strcmp(p1->name,name)==0)
{
printf("%-13ld %-13s %-13s %-13s %-200s\n",h->num,h->name,h->sex,h->brith,h->remark);
n++;
}
if(p1->num==num)
return p1;
p1=p1->next;
}
if(n==1)
{
printf("没有查找到该数据!");
}
return NULL;
}
struct student *search2(long num,char *name,struct student *h)//返回num所在地址的前一地址!
{
struct student *p1, *p2;
int n=1;
p1=h;
p2=h;
if(h==NULL)
{
//printf("没有查找到该数据\n");
return NULL;
}
if(h->num==num)
{
return p2;
}
else if(p1->next==NULL)
{
if(p1->num==num)
{
//printf("%-13ld %-13s %-13s %-13s %-20s\n",h->num,h->name,h->sex,h->brith,h->remark);
return p2;
}
else
{
//printf("没有查找到该数据!");
return NULL;
}
}
else
{
for(;p1!=NULL;)
{
p2=p1;
p1=p1->next;
if(p1->num==num)
{
printf("%-13ld %-13s %-13s %-13s %-20s\n",h->num,h->name,h->sex,h->brith,h->remark);
return p2;
}
}
}
//printf("没有查找到该数据!");
return NULL;
}
struct student *add(struct student *p1,struct student *p2,struct student *h)//add插入
{
struct student *p3;
if(p1!=NULL)
{
p3=(struct student *)malloc(sizeof(struct student));
printf(" num:");
scanf("%ld",&p3->num);
printf(" name:");
scanf("%s",&p3->name);
printf(" sex:");
scanf("%s",&p3->sex);
printf(" brith:");
scanf("%s",&p3->brith);
printf(" remark:");
scanf("%s",&p3->remark);
p1->next=p3;
p3->next=p2;
return h;
}
return h;
}
struct student *delet(struct student *p1,struct student *p2,struct student *h)//delete删除
{
if(p1==NULL)
{
return h;
}
if(p1->num==h->num)//1
{
if(p1->num==p2->num)
{
h=h->next;
return h;
}
else
p1->next=p2->next;
}
else if(p1==NULL)//z1
{
printf("\n");//bcz
}
else
p1->next=p2->next;
return h;
}
struct student *revise(struct student *p1,struct student *h)//revise修改
{
struct student *p2;
if(p1==NULL)
{
return h;
}
//p2=p1;
p2=(struct student *)malloc(sizeof(struct student));
printf(" num:");
scanf("%ld",&p1->num);
printf(" name:");
scanf("%s",&p1->name);
printf(" sex:");
scanf("%s",&p1->sex);
printf(" brith:");
scanf("%s",&p1->brith);
printf(" remark:");
scanf("%s",&p1->remark);
p2=p1->next;
p1=p2;
return h;
}
int print(struct student *h)//printf输出!
{
for(;h!=NULL;)
{
printf("%-13ld %-13s %-13s %-13s %-20s\n",h->num,h->name,h->sex,h->brith,h->remark);
h=h->next;
}
return 0;
}
void menu1(void)//菜单一
{
system("CLS");
printf("\t\t\t单链表C语言实现实例\n");
printf("\t\t|————————————————|\n");
printf("\t\t| |\n");printf("\t\t| [1] 建 立 新 表 |\n");
printf("\t\t| [2] 查 找 数 据 |\n");
printf("\t\t| [3] 插 入 数 据 |\n");
printf("\t\t| [4] 删 除 数 据 |\n");
printf("\t\t| [5] 修 改 数 据 |\n");
printf("\t\t| [6] 打 印 数 据 |\n");
printf("\t\t| [7] 帮 助() |\n");
printf("\t\t| [8] 退 出 |\n");
printf("\t\t| |\n");
printf("\t\t| 如未建立新表,请先建立! |\n");
printf("\t\t| |\n");
printf("\t\t|————————————————|\n");
printf("\t\t 请输入你的选项(1-8):");
}
void menu2(void)//菜单2
{
system("CLS");
printf("\t\t 请输入你的查询方式(1-2):\n");
printf("\t\t|————————————————|\n");
printf("\t\t| [1] 按 学 号 查 询\n");
printf("\t\t| [2] 按 姓 名 查 询\n");
printf("\t\t| |\n");
printf("\t\t| 如未建立新表,请先建立! |\n");
printf("\t\t|————————————————|\n");
printf("\t\t 请输入你的选项(1-2):");
}
int main()
{
int m, choise;
long num;
struct student *head, *p1, *p2;
char name[20], *a="0";
head=NULL;
menu1();
for( ; ; )
{
scanf("%d",&choise);
switch(choise)
{
case 1: head=creat();system("CLS");break;
case 2: printf("请选择查询方式:");
menu2();
scanf("%d",&m);
if(m==1)
{
printf("输入你所要查找的人的学号:");
scanf("%ld",&num);
printf("学号 姓名 性别 生日 备注\n");
search1(num,a,head);
}
else if(m==2)
{
printf("输入你所要查找的人的姓名:");
scanf("%s",name);
printf("学号 姓名 性别 生日 备注\n");
search1(0,name,head);
}
printf("\n按回车键回到主菜单。");
getchar();
getchar();
break;
case 3: printf("学号 姓名 性别 生日 备注\n");//输出表后便于操作!
print(head);
printf("输入你要在哪个学号后面插入(如在排头插入请输入0):");
scanf("%ld",&num);
if(num==0)
{
p1=(struct student *)malloc(sizeof(struct student));
printf(" num:");
scanf("%ld",&p1->num);
printf(" name:");
scanf("%s",&p1->name);
printf(" sex:");
scanf("%s",&p1->sex);
printf(" brith:");
scanf("%s",&p1->brith);
printf(" remark:");
scanf("%s",&p1->remark);
p1->next=head;
head=p1;
}
else
{
p1=search1(num,a,head);
if(p1==NULL)
{
goto a;
}
p2=p1->next;
head=add(p1,p2,head);
}
a: printf("\n按回车键回到主菜单!");
getchar();
getchar();
break;
case 4: printf("学号 姓名 性别 生日 备注\n");//输出表后便于操作!
print(head);
printf("\n输入你所要删除的人的学号:");
scanf("%ld",&num);
p1=search2(num,a,head);
p2=search1(num,a,head);
head=delet(p1,p2,head);
printf("\n按回车键回到主菜单!");
getchar();
getchar();
break;
case 5: printf("学号 姓名 性别 生日 备注\n");//输出表后便于操作!
print(head);
printf("\n输入你所要修改的人的学号:");
scanf("%ld",&num);
p1=search1(num,a,head);
revise(p1,head);
printf("\n按回车键回到主菜单!");
getchar();
getchar();
break;
case 6: printf("学号 姓名 性别 生日 备注\n");
print(head);
printf("\n按回车键回到主菜单。");
getchar();
getchar();
break;
case 7: printf("1.“学号”索引具有唯一标识.不允许重复.系统默认唯一重复时查询时优先显示,不警告!!!\n");
printf("2.创建n个同学的链表,当输入NUM为0时结束 !!!\n");
printf("3.“姓名”不能为0 !!!\n");
printf("4.“插入”“删除”“修改”时输入无效学号系统不予提示保留本次操作前建表内容!!!\n");//已修复!!!
printf("5.未建表时不允许使用“删除”功能否则会引起奔溃!!!\n");//已修复!!!
printf("6.请按提示正确操作!!!\n");
printf("\n按回车键回到主菜单!");
getchar();
getchar();
break;
case 8: return 0;break;
default: printf("你输入了非法字符!按回车键回到主菜单。");
}
system("CLS");
menu1();
}
}呵呵,学习c3个多月了,谢谢论坛里帮助过我的人,自己写的很吃力,但还是坚持写完了,大家帮忙看看,有什么问题帮忙指出来,格式,逻辑的都行哈!!一定虚心接受!
[ 本帖最后由 清微御宇 于 2012-5-29 23:15 编辑 ]










我晕第一次粘贴东西掉太多了!!!!