仅仅只做学习记录,代码还有很多不足没弄清楚,比如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;
}