本文是关于学生信息 新建、增加、删除、显示、循环 的小程序
1、按照需求量,通过动态申请的方式,新建学生节点,录入信息,再次新建时,则舍弃之前的链表
2、按照需求量,通过动态申请的方式,新增学生节点,录入信息(先有链表,再增加,没有则新建 1)
3、删除学生信息(可删除重复信息),并输出 删除数量 及删除 学号对应的学生全部信息(按学号)
4、输出新增学生信息
5、输出全部学生信息
6、去除重复学生信息(按学号)
7、输出信息时,带有序号,可以产看新增了几条信息,也可以查看全部信息数量
8、循环运行
9、自主选择退出
10、提示 错误输入 或 修正
截图展示:
首次进入需要先创建学生链表,输入非 1 ,自动修正为 1,输入 0 可以直接退出。
1、创建新的学生链表
再次选择 1 时,放弃之前的链表 重新创建
2、在原有的链表中增加学生信息(尾部增加)
4、显示新增的学生信息
5、显示当前全部学生信息
3、删除学生信息(重复信息一并删除),显示删除数量及学生详细信息(按学号查找、删除)
删除后查看对比
多增加一些信息看看,(数量不受限制)
查看一下(带序号输出,总数一目了然)
6、去除重复信息
去重 和 删除 功能 相似,双重循环遍历链表,查找外循环对应的对象,内循环开始节点起始于外循环的下一节点, 查找到删除即可;(最后的节点处理要注意,否则会内存报错)
在此基础上,还可以增加比如 按姓名、身份证、手机号等查找的功能
按其他信息查找 和 现在的按学号查找 功能相同 查找的对象(结构体 成员不同而已),有需要的自己添加吧;
代码如下:
#include "stdio.h"
#include "stdlib.h"
int count=0;
/*出生日期结构体*/
struct birthday
{
int year;
int month;
int data;
};
/*学生信息结构体*/
struct student //定义结构体
{
double num; //学号
char name[20]; //姓名
char sexy[4]; //性别
struct birthday bir;//出生日期
char id_num[20]; //身份证
char phone[12]; //电话
char add[40]; //地址
struct student *next; //结构体指针
} ;
/*函数声明*/
void add_creact_s(struct student *head);//增加链表
void del_creact_s(struct student *head,struct student *last);//删除链表
void Duplicate_removal_s(struct student *head,struct student *last); //去重
void input_s(struct student *head,struct student *last,struct student *pin);//输入信息
void p_list();//表格标题
void aoutput_s(struct student *head,struct student *last,struct student *pout);//输出信息
/*循环函数起点*/
int mean(struct student *head,struct student *last)
{
printf("【0】退出\n【1】创建新表\n【2】增加学生信息\n【3】删除学生信息\n");
printf("【4】查看新增信息\n【5】查看全部信息\n【6】去除重复信息\n\n");
printf("选项: ") ;
fflush(stdin);//清除缓存
char c=getchar();//接收任意选择
int i_se=c-'0';//转换为数字
struct student *mlast;//增加学生信息时,处理最后的空指针
if(i_se!=0)
if(count==0&&i_se!=1)
{
printf("请先创建学生信息表.....\n\n");
i_se=1;
}
switch(i_se)
{
case 0: system("pause");//退出
exit(0);
case 1: if(count==0)
{
count++;
add_creact_s(head);//创建新学生信息表
input_s(head,last,head);
}
else
{
count=0;
char c;
printf("创建新的班级: y?n\n");
fflush(stdin);
scanf("%c",&c);
if(c=='y'||c=='Y')
{
main();
}
else
mean(head,last);
}
case 2: last=head; //增加学生信息
mlast=head->next;
while(mlast->next!=NULL)/*尾指针指向链尾*/
{
last=mlast;
mlast=mlast->next;
}
add_creact_s(last);
input_s(head,last,last);
break;
case 3: del_creact_s(head,last);//删除学生信息
break;
case 4: aoutput_s(head,last,last);//显示增加的学生信息
break;
case 5: aoutput_s(head,last,head);//显示全部学生信息
break;
case 6: Duplicate_removal_s(head,last);//去除重复的学生信息
break;
default :
printf("输入错误...\n") ;
mean(head,last);
}
system("pause");
}
/*创建or增加链表*/
void add_creact_s(struct student *adc)
{
int sn;
printf("学生人数:");
scanf("%d",&sn);
int i;
struct student *q;
q=adc;
for(i=0;i<=sn;i++) //循环 创建所需数量的链表
{
struct student *p;//创建头指针
if((p=(struct student *)malloc(sizeof(struct student)))==NULL)
{
printf("Sorry 分配内存失败......\n");
exit(0);
}
q->next=p;
p->next=NULL;
q=p;
}
}
/*删除学生信息*/
void del_creact_s(struct student *head,struct student *last)
{
int sum_s=0;
struct student *p,*q,*pde;
p=head;
q=head->next;
double del;
printf("要删除的学号:");
scanf("%lf",&del);
printf("\n");
while(q->next!=NULL)
{
if(q->num==del)//删除满足条件的节点
{
sum_s++;//计数
pde=q;//标记删除学生信息
p->next=q->next;
}
p=q;
q=q->next;
}
if(sum_s==0)
{
printf("要删除的学生信息不存在,请查证后操作。\n\n");
mean(head,last);
}
else
printf("共删除 %d 条如下信息:\n",sum_s);
/*显示删除学生信息*/
printf("\n***************************************************学生信息表**************************************************\n");
p_list();
printf(" ———————————————————————————————————————————————————————\n");
printf("| [%-4d] ",1);
printf("| %-9.0lf| %-8s| %-4s|",pde->num,pde->name,pde->sexy);
printf(" %-5d| %-3d| %-3d|",(*pde).bir.year,(*pde).bir.month,(*pde).bir.data);
printf(" %-20s| %-13s| %-19s|\n",pde->id_num,pde->phone,pde->add);
printf(" ———————————————————————————————————————————————————————\n");
/*释放临时空间*/
free(pde);
/*删除完成,返回循环*/
mean(head,last);
}
/*去除重复的学生信息*/
void Duplicate_removal_s(struct student *head,struct student *last)
{
int sum_s;
struct student *pout,*p,*q,*pde;
pout=head;
printf("\n");
while(pout->next!=NULL)
{
pout=pout->next;
p=pout;
if(p->next==NULL)//p为最后的节点时,q不在赋值,否则会内存出错
{ if(p->num==pout->num)
{
sum_s++;//计数
pde=q;//标记删除学生信息
pout->next=NULL;
q->next=NULL;
}
}
else
{
q=p->next;
sum_s=0;
while(q->next!=NULL)
{
if(q->num==pout->num)//删除满足条件的节点
{
sum_s++;//计数
pde=q;//标记删除学生信息
p->next=q->next;
}
p=q;
q=q->next;
}
}
if(sum_s>0)
{
printf("共删除 %d 条如下信息:\n",sum_s);
/*显示删除学生信息*/
p_list();
printf(" ———————————————————————————————————————————————————————\n");
printf("| [%-4d] ",1);
printf("| %-9.0lf| %-8s| %-4s|",pde->num,pde->name,pde->sexy);
printf(" %-5d| %-3d| %-3d|",(*pde).bir.year,(*pde).bir.month,(*pde).bir.data);
printf(" %-20s| %-13s| %-19s|\n",pde->id_num,pde->phone,pde->add);
printf(" ———————————————————————————————————————————————————————\n");
}
}
/*释放临时空间*/
free(pde);
/*删除完成,返回循环*/
mean(head,last);
}
/*输入数据*/
void input_s(struct student *head,struct student *last,struct student *pin)
{
int i;
struct student *q;
q=pin->next;
printf("学生的信息:\n");
printf("学号 姓名 性别 出生 年 月 日 身份证 电话 地址\n\n");
while(q->next!=NULL)
{
scanf("%lf%s%s",&q->num,&q->name,&q->sexy);
scanf("%d%d%d",&(*q).bir.year,&(*q).bir.month,&(*q).bir.data);
scanf("%s%s%s",&q->id_num,&q->phone,&q->add);
q=q->next;
}
printf("\n");
printf("恭喜你,完成录入啦。。。。\n\n");
mean(head,last);
}
/*打印表头*/
void p_list()
{
int i;
char list_sheet[10][8]={{"学号"},{"姓名"},{"性别"},{"年"},{"月"},{"日"},{"身份证"},{"电话"},{"地址"},{"序号"}};
char *p[10];
for(i=0;i<10;i++)
p[i]=list_sheet[i];
printf("\n ———————————————————————————————————————————————————————\n");
printf("| \t\t\t\t 出生日期 |");
printf("\n| %-8s%-12s%-8s%-8s",p[9],p[0],p[1],p[2]);//序号、学号、姓名、性别
printf("%-5s%-4s%-10s",p[3],p[4],p[5]); //年 月 日
printf("%-21s%-18s%-14s|\n",p[6],p[7],p[8]); //身份证、电话、地址
}
void aoutput_s(struct student *head,struct student *last,struct student *pout)
{
int i=1;
struct student *q;
q=pout->next;
printf("\n***************************************************学生信息表**************************************************\n");
p_list();
printf(" ———————————————————————————————————————————————————————\n");
while(q->next!=NULL)
{
printf("| [%-4d] ",i++);
printf("| %-9.0lf| %-8s| %-4s|",q->num,q->name,q->sexy);
printf(" %-5d| %-3d| %-3d|",(*q).bir.year,(*q).bir.month,(*q).bir.data);
printf(" %-20s| %-13s| %-19s|\n",q->id_num,q->phone,q->add);
q=q->next;
printf(" ———————————————————————————————————————————————————————\n");
}
printf("\n");
mean(head,last);
}
/*主函数*/
int main()
{
struct student *head=NULL;//创建头指针
head=(struct student *)malloc(sizeof(struct student));
struct student *last=NULL;//创建尾指针
last=head;
printf("******学生信息表******\n\n");
mean(head,last);
}
2020 03 20修改代码
修改源代码 删除不存在信息报错
修改去除重复息输出形式(去除重复的时候最后会多删除一个全是 0 的节点,留作交流,请大家支招)
#include "stdio.h"
#include "stdlib.h"
int count=0;
/*出生日期结构体*/
struct birthday
{
int year;
int month;
int data;
};
/*学生信息结构体*/
struct student //定义结构体
{
double num; //学号
char name[20]; //姓名
char sexy[4]; //性别
struct birthday bir;//出生日期
char id_num[20]; //身份证
char phone[12]; //电话
char add[40]; //地址
struct student *next; //结构体指针
} ;
/*函数声明*/
void add_creact_s(struct student *head);//增加链表
void del_creact_s(struct student *head,struct student *last);//删除链表
void Duplicate_removal_s(struct student *head,struct student *last); //去重
void input_s(struct student *head,struct student *last,struct student *pin);//输入信息
void p_list();//表格标题
void aoutput_s(struct student *head,struct student *last,struct student *pout);//输出信息
/*循环函数起点*/
int mean(struct student *head,struct student *last)
{
printf("【0】退出\n【1】创建新表\n【2】增加学生信息\n【3】删除学生信息\n");
printf("【4】查看新增信息\n【5】查看全部信息\n【6】去除重复信息\n\n");
printf("选项: ") ;
fflush(stdin);//清除缓存
char c=getchar();//接收任意选择
int i_se=c-'0';//转换为数字
struct student *mlast;//增加学生信息时,处理最后的空指针
if(i_se!=0)
if(count==0&&i_se!=1)
{
printf("请先创建学生信息表.....\n\n");
i_se=1;
}
switch(i_se)
{
case 0: system("pause");//退出
exit(0);
case 1: if(count==0)
{
count++;
add_creact_s(head);//创建新学生信息表
input_s(head,last,head);
}
else
{
count=0;
char c;
printf("创建新的班级: y?n\n");
fflush(stdin);
scanf("%c",&c);
if(c=='y'||c=='Y')
{
main();
}
else
mean(head,last);
}
case 2: last=head; //增加学生信息
mlast=head->next;
while(mlast->next!=NULL)/*尾指针指向链尾*/
{
last=mlast;
mlast=mlast->next;
}
add_creact_s(last);
input_s(head,last,last);
break;
case 3: del_creact_s(head,last);//删除学生信息
break;
case 4: aoutput_s(head,last,last);//显示增加的学生信息
break;
case 5: aoutput_s(head,last,head);//显示全部学生信息
break;
case 6: Duplicate_removal_s(head,last);//去除重复的学生信息
break;
default :
printf("输入错误...\n") ;
mean(head,last);
}
system("pause");
}
/*创建or增加链表*/
void add_creact_s(struct student *adc)
{
int sn;
printf("学生人数:");
scanf("%d",&sn);
int i;
struct student *q;
q=adc;
for(i=0;i<=sn;i++) //循环 创建所需数量的链表
{
struct student *p;//创建头指针
if((p=(struct student *)malloc(sizeof(struct student)))==NULL)
{
printf("Sorry 分配内存失败......\n");
exit(0);
}
q->next=p;
p->next=NULL;
q=p;
}
}
/*删除学生信息*/
void del_creact_s(struct student *head,struct student *last)
{
int sum_s=0;
struct student *p,*q,*pde;
p=head;
q=head->next;
double del;
printf("要删除的学号:");
scanf("%lf",&del);
printf("\n");
while(q->next!=NULL)
{
if(q->num==del)//删除满足条件的节点
{
sum_s++;//计数
pde=q;//标记删除学生信息
p->next=q->next;
}
p=q;
q=q->next;
}
//修改的地方
if(sum_s==0)
{
printf("要删除的学生信息不存在,请查证后操作。\n\n");
mean(head,last);
}
else
{
printf("共删除 %d 条如下信息:\n",sum_s);
/*显示删除学生信息*/
//printf("\n***************************************************学生信息表**************************************************\n");
p_list();
printf(" ———————————————————————————————————————————————————————\n");
printf("| [%-4d] ",1);
printf("| %-9.0lf| %-8s| %-4s|",pde->num,pde->name,pde->sexy);
printf(" %-5d| %-3d| %-3d|",(*pde).bir.year,(*pde).bir.month,(*pde).bir.data);
printf(" %-20s| %-13s| %-19s|\n",pde->id_num,pde->phone,pde->add);
printf(" ———————————————————————————————————————————————————————\n\n");
/*释放临时空间*/
free(pde);
/*删除完成,返回循环*/
last=last-sum_s;
mean(head,last);
}
}
//修改的地方
/*去除重复的学生信息*/
void Duplicate_removal_s(struct student *head,struct student *last)
{
int sum_s=0;
struct student *pout,*p,*q,*pde,*pfone;
pout=head;
printf("\n");
while(pout->next!=NULL)
{
int i=0;
pfone=pout;
pout=pout->next;
p=pout;
if(p->next==NULL)//p为最后的节点时,q不在赋值,否则会内存出错
{ if(p->num==pout->num)
{
sum_s++;//计数
i++;
pde=q;//标记删除学生信息
//pout->next=NULL;
//q->next=NULL;
pfone=NULL;
}
}
else
{
q=p->next;
while(q->next!=NULL)
{
if(q->num==pout->num)//删除满足条件的节点
{
sum_s++;//计数
i++;
pde=q;//标记删除学生信息
p->next=q->next;
}
p=q;
q=q->next;
}
}
if(sum_s==0)
{
printf("恭喜,不存在重复的学生信息。\n\n");
mean(head,last);
}
else
{
{
/*显示删除学生信息*/
if(sum_s==1)
p_list();
printf(" ———————————————————————————————————————————————————————\n");
printf("| [%-4d] ",i);
printf("| %-9.0lf| %-8s| %-4s|",pde->num,pde->name,pde->sexy);
printf(" %-5d| %-3d| %-3d|",(*pde).bir.year,(*pde).bir.month,(*pde).bir.data);
printf(" %-20s| %-13s| %-19s|\n",pde->id_num,pde->phone,pde->add);
//printf(" ———————————————————————————————————————————————————————\n");
}
/*释放临时空间*/
free(pde);
/*删除完成,返回循环*/
last=last-sum_s;
}
}
printf(" ———————————————————————————————————————————————————————\n");
printf("\n\n请注意,共删除 %d 条信息\n\n",sum_s);
mean(head,last);
}
/*输入数据*/
void input_s(struct student *head,struct student *last,struct student *pin)
{
int i;
struct student *q;
q=pin->next;
printf("学生的信息:\n");
printf("学号 姓名 性别 出生 年 月 日 身份证 电话 地址\n\n");
while(q->next!=NULL)
{
scanf("%lf%s%s",&q->num,&q->name,&q->sexy);
scanf("%d%d%d",&(*q).bir.year,&(*q).bir.month,&(*q).bir.data);
scanf("%s%s%s",&q->id_num,&q->phone,&q->add);
q=q->next;
}
printf("\n");
printf("恭喜你,完成录入啦。。。。\n\n");
mean(head,last);
}
/*打印表头*/
void p_list()
{
int i;
char list_sheet[10][8]={{"学号"},{"姓名"},{"性别"},{"年"},{"月"},{"日"},{"身份证"},{"电话"},{"地址"},{"序号"}};
char *p[10];
for(i=0;i<10;i++)
p[i]=list_sheet[i];
printf("\n***************************************************学生信息表**************************************************\n");
printf("\n ———————————————————————————————————————————————————————\n");
printf("| \t\t\t\t 出生日期 |");
printf("\n| %-8s%-12s%-8s%-8s",p[9],p[0],p[1],p[2]);//序号、学号、姓名、性别
printf("%-5s%-4s%-10s",p[3],p[4],p[5]); //年 月 日
printf("%-21s%-18s%-14s|\n",p[6],p[7],p[8]); //身份证、电话、地址
}
void aoutput_s(struct student *head,struct student *last,struct student *pout)
{
int i=1;
struct student *q;
q=pout->next;
//printf("\n***************************************************学生信息表**************************************************\n");
p_list();
printf(" ———————————————————————————————————————————————————————\n");
while(q->next!=NULL)
{
printf("| [%-4d] ",i++);
printf("| %-9.0lf| %-8s| %-4s|",q->num,q->name,q->sexy);
printf(" %-5d| %-3d| %-3d|",(*q).bir.year,(*q).bir.month,(*q).bir.data);
printf(" %-20s| %-13s| %-19s|\n",q->id_num,q->phone,q->add);
q=q->next;
printf(" ———————————————————————————————————————————————————————\n");
}
printf("\n");
mean(head,last);
}
/*主函数*/
int main()
{
struct student *head=NULL;//创建头指针
head=(struct student *)malloc(sizeof(struct student));
struct student *last=NULL;//创建尾指针
last=head;
printf("******学生信息表******\n\n");
mean(head,last);
}