学生信息管理——包含了链表结点排序

仅仅只做学习记录,代码还有很多不足没弄清楚,比如select:的输入,不同指针的输出等

【问题描述】设有一个存储学生信息的结构体包含:学号(no),姓名(name  ),班级号(classno),大学入学成绩总分(score),学生号指针(pno),班级号指针(pclass),成绩数指针(pscore)。设计一个程序将信息读取并记录到一个链表中,完成如下功能:

1.输入:添加一个学生记录,请按头插法添加

2.输出:输出全部学生记录

3.按no排序:通过pno指针将学生记录按no递增连接起来

4.按no输出:沿pno链输出全部学生记录

5.按classno排序:通过classno指针将学生记录按classno递增连接起来

6.按classno输出:沿classno链输出全部学生记录,当classno一致时,按score递增顺序输出

7.按score排序:通过pscore指针将学生记录按no递增连接起来

8.按score输出:沿pscore链输出全部学生记录,当score一致时,按no递增顺序输出

9.全清:删除学生的全部记录

10.退出:退出运行程序

【目的】链表综合应用

【输入形式】学号,姓名,班级号,成绩

【输出形式】select:以及执行结果

【样例输入】select:1

                     06208 gaoya 2103 630  

                     select:1  

                     06209 lisi 2104 617 

                     select:1

                     06210 lisi 2103 643

                     select:8                    

【样例输出】06209 lisi 2104 617

                    06208 gaoya 2103 630  

                    06210 lisi 2103 643  
【样例说明】添加各学生记录之后,建立链表,执行各种操作

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
struct node {
	int no;
	char name[20];
	int classno;
	int score;
	node *pno;//学号指针
	node *pclass;//班级号指针
	node *pscore;//成绩数指针 
	node *next;
};
node *creat(node *l,int no,char name[],int classno,int score){
	node *p = l;
    node *q = (node*)malloc(sizeof(node));
	q->pclass = NULL;
	q->pno = NULL;
	q->pscore = NULL;
	int len = strlen(name);
	//int no;char name; int classno; int score;
	/*scanf("%d",&q->no);
	scanf("%d %s %d %d",&q->no,&q->name,&q->classno,&q->score);*/
	q->no = no;
	int i;
	for(i = 0; i<len; i++){
	    q->name[i] = name[i];
	} 
	q->classno = classno;
	q->score = score;
	q->pno = p->pno;
	p->pno = q;
	q->pclass = p->pclass;
	p->pclass = q;
	q->pscore = p->pscore;
	p->pscore = q;
	q->next = p->next;
	p->next = q;
	return l;
} 
void putout (node *l){
	node *p = l->next;
	while(p!=NULL){
		printf("0%d %s %d %d\n",p->no,p->name,p->classno,p->score);
		p = p->next;
	}
}
node *Sort_pnoNo(node *l){
    node *pre,*p;//pre记录前置结点
	pre = l;
	p = l->pno;
	node *k = NULL;
	while(l->pno->pno!=k){
		while(p->pno!=k){
		//p->no<p->pno->no
		if(p->no<p->pno->no){
			pre = pre->pno;
			p = p->pno;
		} 
		else if(p->no>=p->pno->no){
			pre->pno = p->pno;
			p->pno = p->pno->pno;
			pre->pno->pno = p;
			pre = pre->pno;
			//p = p->pno;
		}
	}
	k = p;
	pre = l;
	p = l->pno;
}

	
	return l; 
}
void putout_pno(node *l){
	node *p = l->pno;
	while(p!=NULL){
		printf("0%d %s %d %d\n",p->no,p->name,p->classno,p->score);
		p= p->pno; 
	}
}
node *Sort_classno(node *l){
 node *pre,*p;//pre记录前置结点
	pre = l;
	p = l->pclass;
	node *k = NULL;
    while(l->pclass->pclass!=k){
    	while(p->pclass!=k){
		//p->no<p->pno->no
		if(p->classno<p->pclass->classno){
			pre = pre->pclass;
			p = p->pclass;
		} 
		else if(p->classno>=p->pclass->classno){
			pre->pclass = p->pclass;
			p->pclass = p->pclass->pclass;
			pre->pclass->pclass = p;
			pre = pre->pclass;
			//p = p->pclass;
		}
	}
	k = p;
	pre = l;
	p = l->pclass;
}
	
	return l; 
}
node *Sort_pscore(node *l){
    node *pre,*p;//pre记录前置结点
	pre = l;
	p = l->pscore;
	node *k = NULL;
	while(l->pscore->pscore!=k){
		while(p->pscore!=k){
		//p->no<p->pno->no
		if(p->score<p->pscore->score){
			pre = pre->pscore;
			p = p->pscore;
		} 
		else if(p->score>=p->pscore->score){
			pre->pscore = p->pscore;
			p->pscore = p->pscore->pscore;
			pre->pscore->pscore = p;
			pre = pre->pscore;
			//p = p->pscore;
		}
	}
	k = p;
	pre = l;
	p = l->pscore;
}
	
return l; 
}
void putout_classno(node *l){
	node *p = l->pclass;
	while(p!=NULL){
		printf("0%d %s %d %d\n",p->no,p->name,p->classno,p->score);
			p = p->pclass;
	}
}
void putout_pscore(node *l) {
	node *p = l->pscore;
	while(p!=NULL){
		printf("0%d %s %d %d\n",p->no,p->name,p->classno,p->score);
		p = p->pscore;
	}
	
}
node *clear (node *l){
	node *p = l->next;
	node *q;//记录下一个结点 
	while(p!=NULL){
		q = p->next;
		free(p);
		p = q; 
	}
	l->next = NULL;
	return l;
}
int main () {
	int select;int no;char name[20];int classno; int score;
	node *l = (node*)malloc(sizeof(node));
	l->pclass = NULL;
	l->pno = NULL;
	l->pscore = NULL;
	l->next = NULL;
	while(scanf("%d",&select)){
	       if (select==1){
			scanf("%d %s %d %d",&no,name,&classno,&score);
			l=creat(l,no,name,classno,score);
		}         
			else if (select==2){
				putout(l);
			} 
			else if (select==3) {
				l = Sort_pnoNo(l);
			}
			else if (select==4){
				l = Sort_pnoNo(l);
				putout_pno(l);
			}
		    else if (select==5){
		    	l = Sort_classno(l);
			}
		    else if (select==6){
		    	l = Sort_classno(l);
				//l = Sort_pscore(l);
				putout_classno(l);
			}
		    else if (select==7){
		    	l = Sort_pscore(l);
			}
		    else if (select==8){
		    	//l = Sort_pnoNo(l);
				l = Sort_pscore(l);
				putout_pscore(l);
			}
			else if (select==9){
				l = clear(l);
			}
			else if (select==10) break;
			printf("select:\n");
		}
		
    return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值