学生信息管理单链表实现(c语言)

这次将前几天发的顺序表改为单链表实现,总体上也很简单,只是增加了指针域,代码奉上:

#include <stdio.h>
#include<malloc.h>
#include <string.h>
typedef struct {
	int no;
	char name[8];
	float score;
}Student;//定义一个学生基本信息的结构,取名为Student
typedef struct Node{
	Student data;//使用Student 类型定义数据域
	struct Node *next;//使用自身结构定义指针域
	//int listsize;
}LinkNode;//将整个结构定义为LinkNode

//定义链表构造函数
void CreatList(LinkNode *&L,Student a[],int n){
	LinkNode *s,*r;
	L=(LinkNode *)malloc(sizeof(LinkNode));
	r=L;
	for(int i=0;i<n;i++){
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->data=a[i];
		r->next=s;
		r=s;
	}
	r->next=NULL;
	
}
//定义长度函数
int ListLength(LinkNode *L){
	int n=0;
	LinkNode *p=L;
	while(p->next!=NULL){
		n++;
		p=p->next;
		
	}
	printf("该链表长度为%d",n);
	return 0;
} 

int length(LinkNode *L){
	int n=0;
	LinkNode *p=L;
	while(p->next!=NULL){
		n++;
		p=p->next;
		
	}
	
	return n;
} 


//定义输出函数
void DisList(LinkNode *L){
	LinkNode *p=L->next;
		int n=0;
		LinkNode *q=L;
		while(q->next!=NULL){
			n++;
			q=q->next;
			
	} 
		printf("**************计科一班学生信息**************\n");
		printf("序号\t学号\t姓名\t\t\t成绩\n");
		
	int i=1;
	float avescore=0;
	
	while(p!=NULL){
	
	printf("%d\t%d\t%-8s\t\t%.2f\n",i,p->data.no,p->data.name,p->data.score);
	//printf("成绩为%f\n",p->data.score);
	avescore +=p->data.score;
	p=p->next;
		i++;
	
				
	}
					printf("平均分为%.2f\n",avescore/n);
	
	 //printf("\n");
	
} 
//定义插入函数1,测试用的,赖得删了
int insretlist(LinkNode *&L,int i,Student e){
	int j=0;
	LinkNode *p=L,*s;
	if(i<=0) return false;
	
while(j<i-1&&p!=NULL){
	j++;
	p=p->next;
	
		
		
	}
	if(p==NULL)return false; 
	else {
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->data=e;
		s->next=p->next;
		p->next=s;
		return true;
	}
	
}
//定义插入函数

int  insertstu(LinkNode *L){
	 	LinkNode *p=L,*s;
	int j=0, i=0,n=0;
			LinkNode *q=L;
			while(q->next!=NULL){
				n++;
				q=q->next;
			}
	printf("请输入插入的位置:");
	scanf("%d",&i);
	while(j<i-1 && p!=NULL){
		p=p->next;
		j++;
	}
	if(p==NULL) return false;
	else {
		s=(LinkNode *)malloc(sizeof(LinkNode));
		int no;char name[8];float score;
		printf("请输入该同学的学号(1-4位)\n");
		scanf("%d",&no);
		while(no<1||no>9999){
			printf("不符合学号规定长度,请重新输入!\n");
			scanf("%d",&no);
			
		}
		s->data.no=no;
				printf("请输入该同学的姓名\n");
				scanf("%s",&name); 
				
				while(strlen(name)<4||strlen(name)>8) {
					printf("不符合规定姓名长度,请重新输入!\n");
					scanf("%s",&name); 
				}
				strcpy(s->data.name,name); 
						printf("请输入该同学的成绩\n");
						scanf("%f",&score);
						
						int count = 1;
									float m=score;
											
											while(m>9){
												m=m/10;
												count ++;
												
											}
											while(count>2||count<1){
							printf("不符合规定长度,请重新输入!\n");
							count=1;
						scanf("%f",&score);
							m=score;
																					 
							while(m>9){
							m=m/10;
							count ++;
			}
																							 															
		}
											  															
						s->data.score=score;
						s->next=p->next;
						p->next=s;
						printf("插入完成!\n");
						DisList(L); 
				
		
		
	} 
	
}




// bool Dellist(LinkNode *&L,int i,Student &e){
// 	int j=0;
// 	LinkNode *p=L,*q;
// 	if(i<=0)return false;
// 	while(j<i-1 && p!=NULL){
// 		j++;p=p->next;
// 		
//	 }
// 	if(p==NULL)
// 		return  false;
// 		
// 		else {
// 			q=p->next;
// 			if(q==NULL)
// 				return false;
//			 e=q->data;
//			 p->next=q->next;
//			 free(q);
//			 return true;
//		 }
//	
// 	
// }
//定义删除函数

int delstu(LinkNode *L){
	LinkNode *p=L,*q;
	int j, i;
	printf("请输入要删除同学的序号:\n");
	scanf("%d",&i);
	if(i<1||i>length(L))
	{
		printf("该同学不存在,请重新输入!\n");
		 	scanf("%d",&i);
		 
	}
	else {printf("该学生存在");}
	while(j<i-1 && p!=NULL){
		j++;
		p=p->next;
	}
	q=p->next;
	p->next=q->next;
	free(q);
	printf("删除成功!\n");
	DisList(L); 
	
	return 0;
}

//定义修改函数,内置修改
 int update(LinkNode *L,Student g,Student h){
 	//int i=1;
 	LinkNode *p=L->next;
 	
 	int n=0;
	 	LinkNode *q=L;
	 	while(q->next!=NULL){
	 		n++;
	 		q=q->next;
	 		
	 	}
 	
 	for(int i=0;i<n;i++){
 	if(p!=NULL && (p->data.no==g.no||p->data.name==g.name||p->data.score==g.score)){
	 	p->data.no=h.no,strcpy(p->data.name,h.name),p->data.score=h.score;
	 //3printf("找到了,在第%d位",i+1);
	 }
	 else {
	 	p=p->next;
	 	
	 }
 	}
//	 if(p==NULL){
//	 	printf("p为空"); 
//	 return 0;}
//	 else {
//	 //	printf("第%d次找到\n",i);
//	 printf("找到了"); 
//	 	p->data.no=h.no,strcpy(p->data.name,h.name),p->data.score=h.score;
//	 	printf("找到了g,i为%d",i);
	// }
	 return 0;
 }
 //定义修改函数
 int updatestu(LinkNode *&L){
 	LinkNode *p=L->next;
 	int no;
 	printf("请输入要修改的学生序号\n");
 	scanf("%d",&no);
 	while(no<1||no>length(L)){
	 				printf("该同学不存在,请重新输入!\n");
		 scanf("%d",&no);
	 } 
 	int j=0,no1;
 	
 while(j<no){
  p=p->next;
  j++;
 }
 if(p!=NULL){
 	printf("已找到该学生\n");
 	printf("将该学生学号%d修改为:\n",p->data.no);
 	scanf("%d",&no1);
 	while(no1<1||no1>9999){
	 			printf("不符合学号规定长度,请重新输入!\n");
	 			scanf("%d",&no1);
	 			
	 		}
	 		p->data.no=no1;
 }
 char name[8];
  printf("将姓名%s修改为:\n",p->data.name);
  scanf("%s",&name);
  while(strlen(name)<4||strlen(name)>8) {
  					printf("不符合规定姓名长度(2-8个字符),请重新输入!\n");
  					scanf("%s",&name); 
  				}
  				strcpy(p->data.name,name); 
  				
  				printf("将该同学成绩%.2f修改为:\n",p->data.score);
  				float score;
				scanf("%f",&score);
				//p->data.score=score;
				int count = 1;
				  	float m=score;
				  											
				  	while(m>9){
				  	m=m/10;
				  	count ++;
				  		}
				  		while(count>2||count<1){
				  				printf("不符合规定长度(满分100),请重新输入!\n");
				  				count=1;
				  				scanf("%f",&score);
				  				m=score;
				  																					 
				  				while(m>9){
				  				m=m/10;
				  				count ++;
				  			}
				  																							 															
				  		}
				  		p->data.score=score;
  
  
 }
//定义菜单
int menu(){
	   printf(" \n按回车键进入菜单........\n");
	int c;
		getchar(); 
		printf("请输入想要操作的代码数字:\n");
		printf("****************MENU******************\n");
		   printf("       1.插入学生信息\n");
		   printf("       2.删除学生信息\n");
		   printf("       3.修改学生信息\n");
		   printf("       4.查看学生信息表\n"); 
		   printf("       5.查看学生表长度\n"); 
		   printf("       6.退出\n");		
		scanf("%d",&c);
		while(!(c>=1 && c<=6)){
			printf("请输入数字1-6!\n"); 
			scanf("%d",&c);
			if(c>=1 && c<=6)
			break;
		}
		return c;
		
	} 

//定义主函数,进行单链表的初始化,预先插入三条数据,展示学生信息
int main(){
	
	LinkNode *L;
	Student data[100];
	Student g,h;
	g.no=1;strcpy(g.name,"六万群");g.score=99;
	h.no=5;
	strcpy(h.name,"周小其");
	h.score=95; 
	data[0].no=1;data[1].no=2;
strcpy(data[0].name,"六万群"); 
strcpy(data[1].name,"八万群"); 
data[0].score=99;data[1].score=88;
	Student e,f;
	e.no=3,strcpy(e.name,"九万群"),e.score=56; 
CreatList(L,data,2);
insretlist(L,3,e);//插入e,就按群 
//Dellist(L,2,f);//删除第二条八万群 
update(L,g,h);//找到g改为h 
DisList(L);
for(;;){
		switch(menu()){
			case 1:{
				insertstu(L);
			break;
		};
		case 2:{
			 delstu(L);
			 break;
			
		}
		case 3:{
			updatestu(L);
			break;
		}
		case 4:{
			DisList(L);
			break;
		}
		case 5:{
			ListLength(L);
			break;
		}
		case 6:{
			
			exit(0);
		}
		
		 }
		}
	return 0;
}

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦见Utaoki

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值