动态创建链表中包含链表和静态创建链表中包含链表

题目:采用两个结构体,一个结构体记录学生信息,一个记录年级信息。
情景:链表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;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值