两个链表的合并

#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
struct  student
{long num;
 int score;
 struct student *next;
};

struct student lista,listb;
int n,sum=0;

int main()
{struct student *creat(void);
 struct student *insert(struct student  *,struct student *);
 void print(struct student *);
 struct student *ahead,*bhead,*abh;
 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;
}

struct student *creat(void)       //建立链表函数
 {struct student *p1,*p2,*head;
  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,%d",&p1->num,&p1->score);
  head=NULL;
  while(p1->num !=0)
    {n=n+1;
     if (n==1)
       head=p1;
     else
       p2->next=p1;
     p2=p1;
     p1=(struct student *)malloc(LEN);
     scanf("%ld,%d",&p1->num,&p1->score);
    }
    p2->next=NULL;
  return(head);
}

/*struct student *creat(void)
 {
 	struct student*p1,*p2,*head;
 	n=0;
 	p1=p2=(struct student*)malloc(LEN);
 	scanf("%ld,%d",&p1->num,&p1->score);
 	while(p1->num!=0)

 	 {
	 	n=n+1;
	 	if(n==1)
	 	head=p1;
	 	else
	 	p2->next=p1;
	 	p2=p1;
 	    p1=(struct student*)malloc (LEN);
        scanf("%ld %d",&p1->num,&p1->score);
 	 }
	 p2->next=NULL;	
	 	
	 return (head);
 }
 */   
/*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);
 }
*/
/*struct student *creat(void)
 {
 	struct student*p1,*p2,*head;
 	int n=0;
 	p1=p2=(struct student*)malloc(LEN);
 	scanf("%d,%f",&p1->num,&p1->score);
 	while(p1->num!=0)

 	 {
	 	n=n+1;
	 	if(n==1)
	 	head=p1;
	 	else
	 	p2->next=p1;
	 	p2=p1;
 	    p1=(struct student*)malloc (LEN);
        scanf("%d %f",&p1->num,&p1->score);//给成员赋值时注意要带赋值号 
 	 }
	 p2->next=NULL;	
     return (head);
 }
 
 */
 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(pa1=ah)
	        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);
 }
 
void print(struct student *head)  //输出函数
  {struct student  *p;
   printf("There are %d records:  \n",sum);
   p=head;
   if (p !=NULL)
     do
       {printf("%ld %d\n",p->num,p->score);
	    p=p->next;
       }while (p !=NULL);
   }

/*
1001 ,60 
1090 ,68
1050 ,58
0
1058 ,96
1040 ,52
0
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值