题目:采用两个结构体,一个结构体记录学生信息,一个记录年级信息。
情景:链表A,每个节点存放一个新链表,假设五个链表B1、B2、B3、B4、B5.
场景:一个年级,相当于链表A,该年级的五个班,相当于B1、B2、B3、B4、B5,
功能:录入成绩,语文、数学、英语,找出三科总分最高分、最低分,算出平均分。
说明:本题主要考的是怎样才能在链表中插入链表
动态创建链表只有怎样创建5个班每个班5个人,后面的功能录入成绩,语文、数学、英语,找出三科总分最高分、最低分,算出平均分,和静态链表是大同小异。
动态创建链表
#include<stdio.h>
#include<stdlib.h>
struct person *sd;
struct person
{
char name[10];
int chinese;
int math;
int english;
int sum;
struct person *next1;
};
struct class
{
struct class *next;
struct person *stu;
};
struct class *CreatLink(struct class *head)
{
struct class *new = (struct class *)malloc(sizeof(struct class));
new->next = head;
head = new;
return head;
}
struct class *CreatMuch(int c,struct class *head)
{
int i;
for(i=0;i<c;i++)
{
head = CreatLink(head);
}
return head;
}
struct person *CreatLink1(struct person *head)
{
struct person *new = (struct person *)malloc(sizeof(struct class));
new->next1 = head;
head = new;
return head;
}
struct person *CreatMuch1(int p,struct person *head)
{
int i;
for(i=0;i<p;i++)
{
head = CreatLink1(head);
}
return head;
}
void classconnectperson(int c,struct class *cs)
{
int i;
int cnt ;
int p;
struct class *change = (struct class *)malloc(sizeof(struct class));
sd =NULL;
printf("input 1 class the number of student \n");
scanf("%d",&p);
sd = CreatMuch1(p,sd);
cs->stu = sd;
printf("input 2 class the number of student \n");
scanf("%d",&p);
sd = CreatMuch1(p,sd);
cs->next->stu = sd;
printf("input 3 class the number of student \n");
scanf("%d",&p);
sd = CreatMuch1(p,sd);
cs->next->next->stu = sd;
printf("input 4 class the number of student \n");
scanf("%d",&p);
sd = CreatMuch1(p,sd);
cs->next->next->next->stu = sd;
printf("input 5 class the number of student \n");
scanf("%d",&p);
sd = CreatMuch1(p,sd);
cs->next->next->next->next->stu = sd;
}
void print(struct class *head)
{
int cnt = 0;
while(head != NULL){
cnt++;
head = head->next;
}
printf("class:%d\n",cnt);
}
void print1(struct person *head)
{
int cnt = 0;
while(head!= NULL){
cnt++;
head = head->next1;
}
printf("person:%d\n",cnt);
}
int main()
{
int c;
struct class *cs;
cs = NULL;
printf("please input class\n");
scanf("%d",&c);
cs =CreatMuch(c,cs);
print(cs);
classconnectperson(c,cs);
print1(sd);
printf("creat person successful\n");
return 0;
}
说明:指针用函数传参时也是临时变量不会导致main函数的指针发生偏移(也就是传过去过后函数结束后就被释放),如果不想返回的话那么就需要传二级指针进去,就可以不返回了。
静态创建链表
#include <stdio.h>
struct person
{
char name[10];
int chinese;
int math;
int english;
int sum;
struct person *next;
};
struct class
{
struct class *next1;
struct person *head;
};
int getGrade(struct person *head,int cnt)
{
struct person *p;
int i = 0;
++cnt;
p = head;
while(p != NULL){
++i;
printf("please input b%d%d name:\n",cnt,i);
scanf("%s",p->name);
printf("please input b%d%d chinese:\n ",cnt,i);
scanf("%d",&p->chinese);
printf("please input b%d%d math:\n ",cnt,i);
scanf("%d",&p->math);
printf("please input b%d%d english:\n ",cnt,i);
scanf("%d",&p->english);
p->sum = p->chinese + p->math + p->english;
p = p->next;
putchar('\n');
}
return cnt;
}
int prin(struct person *head,int cnt)
{
struct person *p;
p=head;
++cnt;
printf("##############################################%dclass#########################################\n",cnt);
while(p!=NULL){
printf("%s\n",p->name);
printf("chinese:%d math:%d english:%d\n sum:%d\n ",p->chinese,p->math,p->english,p->sum);
p=p->next;
}
return cnt;
}
struct person *getmaxclass(struct person *head)
{
struct person *p;
struct person *max;
p = head;
max=p;
while(p != NULL){
if(max->sum <= p->sum ){
max=p;
}
p=p->next;
}
return max;
}
struct person *getmax(struct class *head)
{
struct class *p;
p = head;
struct person* max1=getmaxclass(p->head);
struct person* max2 = getmaxclass(p->next1->head);
struct person* max3 = getmaxclass(p->next1->next1->head);
struct person* max4 = getmaxclass(p->next1->next1->next1->head);
struct person* max5 = getmaxclass(p->next1->next1->next1->next1->head);
if(max1->sum<=max2->sum)
{
max1=max2;
}
if(max1->sum<=max3->sum)
{
max1=max3;
}
if(max1->sum<=max4->sum)
{
max1=max4;
}
if(max1->sum<=max5->sum)
{
max1=max5;
}
return max1;
}
struct person *getminclass(struct person *head)
{
struct person *p;
struct person *min;
p = head;
min=p;
while(p != NULL){
if(min->sum >= p->sum ){
min=p;
}
p=p->next;
}
return min;
}
struct person *getmin(struct class *head)
{
struct class *p;
p = head;
struct person* min1=getminclass(p->head);
struct person* min2 = getminclass(p->next1->head);
struct person* min3 = getminclass(p->next1->next1->head);
struct person* min4 = getminclass(p->next1->next1->next1->head);
struct person* min5 = getminclass(p->next1->next1->next1->next1->head);
if(min1->sum>=min2->sum)
{
min1=min2;
}
if(min1->sum>=min3->sum)
{
min1=min3;
}
if(min1->sum>=min4->sum)
{
min1=min4;
}
if(min1->sum>=min5->sum)
{
min1=min5;
}
return min1;
}
float getave(struct class *head,int cnt)
{
struct class* p;
p=head;
int sum=0;
float ave;
while(p->head!= NULL)
{
sum+=p->head->sum;
p->head=p->head->next;
}
while(p->next1->head!= NULL)
{
sum+=p->next1->head->sum;
p->next1->head=p->next1->head->next;
}
while(p->next1->next1->head!= NULL)
{
sum+=p->next1->next1->head->sum;
p->next1->next1->head =p->next1->next1->head->next;
}
while(p->next1->next1->next1->head!= NULL)
{
sum+=p->next1->next1->next1->head->sum;
p->next1->next1->next1->head=p->next1->next1->next1->head->next;
}
while(p->next1->next1->next1->next1->head!= NULL)
{
sum+=p->next1->next1->next1->next1->head->sum;
p->next1->next1->next1->next1->head=p->next1->next1->next1->next1->head->next;
}
ave =( (float)sum)/cnt;
return ave;
}
int main()
{
int cnt = 0;
int i = 0;
struct class B1;
struct class B2;
struct class B3;
struct class B4;
struct class B5;
struct person a1 = {"aa",0,0,0,0,NULL};
struct person a2 = {"aa",0,0,0,0,NULL};
struct person a3 = {"aa",0,0,0,0,NULL};
struct person a4 = {"aa",0,0,0,0,NULL};
struct person a5 = {"aa",0,0,0,0,NULL};
struct person b1 = {"aa",0,0,0,0,NULL};
struct person b2 = {"aa",0,0,0,0,NULL};
struct person b3 = {"aa",0,0,0,0,NULL};
struct person b4 = {"aa",0,0,0,0,NULL};
struct person b5 = {"aa",0,0,0,0,NULL};
struct person c1 = {"aa",0,0,0,0,NULL};
struct person c2 = {"aa",0,0,0,0,NULL};
struct person c3 = {"aa",0,0,0,0,NULL};
struct person c4 = {"aa",0,0,0,0,NULL};
struct person c5 = {"aa",0,0,0,0,NULL};
struct person d1 = {"aa",0,0,0,0,NULL};
struct person d2 = {"aa",0,0,0,0,NULL};
struct person d3 = {"aa",0,0,0,0,NULL};
struct person d4 = {"aa",0,0,0,0,NULL};
struct person d5 = {"aa",0,0,0,0,NULL};
struct person e1 = {"aa",0,0,0,0,NULL};
struct person e2 = {"aa",0,0,0,0,NULL};
struct person e3 = {"aa",0,0,0,0,NULL};
struct person e4 = {"aa",0,0,0,0,NULL};
struct person e5 = {"aa",0,0,0,0,NULL};
B1.next1=&B2;
B2.next1=&B3;
B3.next1=&B4;
B4.next1=&B5;
B1.head = &a1;
a1.next = &a2;
a2.next = &a3;
a3.next = &a4;
a4.next = &a5;
B2.head = &b1;
b1.next = &b2;
b2.next = &b3;
b3.next = &b4;
b4.next = &b5;
B3.head = &c1;
c1.next = &c2;
c2.next = &c3;
c3.next = &c4;
c4.next = &c5;
B4.head = &d1;
d1.next = &d2;
d2.next = &d3;
d3.next = &d4;
d4.next = &d5;
B5.head = &e1;
e1.next = &e2;
e2.next = &e3;
e3.next = &e4;
e4.next = &e5;
cnt=getGrade(B1.head,cnt);
cnt= getGrade(B2.head,cnt);
cnt= getGrade(B3.head,cnt);
cnt= getGrade(B4.head,cnt);
cnt= getGrade(B5.head,cnt);
i= prin(B1.head,i);
i= prin(B1.next1->head,i);
i= prin(B1.next1->next1->head,i);
i= prin(B1.next1->next1->next1->head,i);
i= prin(B1.next1->next1->next1->next1->head,i);
struct person* min=getmin(&B1);
struct person* max=getmax(&B1);
float ave=getave(&B1,25);
printf("max: %s\n chinese:%d math:%d english:%d max:%d \n",max->name,max->chinese,max->math,max->english,max->sum);
printf("min: %s\n chinese:%d math:%d english:%d min:%d \n",min->name,min->chinese,min->math,min->english,min->sum);
printf("ave:%f\n",ave);
return 0;
}