已有 a、b 两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按成绩升序排列。

时间:2021-10-04 00:12:40


#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
	long num;
	float score;
	struct student *next;
};
int n,sum=0;
struct student lista,listb;
struct student *creat(void)
{
	struct student *head;
	struct student *p1,*p2;
	n=0;
	p1=p2=(struct student*)malloc(LEN);
	printf("input number &scores of student:\n");
	printf("if number is 0,stop inputing.\n");
		scanf("%ld,%f",&p1->num,&p1->score);
		head=NULL;
		while(p1->num!=0)
		{
			n++;
			if(n==1)head=p1;
			else p2->next=p1;
			p2=p1;
			p1=(struct student*)malloc(LEN);
			scanf("%ld,%f",&p1->num,&p1->score);
		}
		p2->next=NULL;
		return head;	
} 

int print(struct student *head)
{
	struct student *p;
	printf("\nNow ,These %d records are:\n",n);
	p=head;
	if(head!=NULL)
	do{
		printf("%ld,%5.1f\n",p->num,p->score);
		p=p->next;
	}while(p!=NULL);
}

struct student *insert(struct student *ah,struct student *bh)
{
	struct student *pa1,*pa2,*pb1,*pb2;
	pa2=pa1=ah;
	pb2=pb1=bh;
	
	do
	{while((pb1->num)>(pa1->num)&&(pa1->next!=NULL))
	        {
	         pa2=pa1;
		     pa1=pa1->next;	
	          }
	if((pb1->num)<=(pa1->num))
	   {
		if(ah==pa1)ah=pb1;
		else
		pa2->next=pb1;
		pb1=pb1->next;
		pb2->next=pa1;
		pa2=pb2;
		pb2=pb1;
	    
	   }
	}while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
	if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))
	pa1->next=pb1;
	return ah;
}
int main()
{
	struct student *ahead ,*bhead,*abh;
	long del_num;
	printf("input list a:\n");
	ahead=creat();
	sum=sum+n;
	printf("input list b:\n");
	bhead=creat();
	sum=sum+n;
	abh=insert(ahead,bhead);
	print(abh);
	return 0;	
}