学生信息管理(图+代码;功能:新建,增加,删除,去重、显示、循环)

本文是关于学生信息 新建、增加、删除、显示、循环 的小程序

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); 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值