编辑代码

#include <stdio.h>
#include <malloc.h>

struct student{
    int num;
    int core;
    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;
    print(ahead);
    print(bhead);
    abh=insert(ahead,bhead);
    print(abh);
    return 0;
}
struct student * creat(){
    struct student *p1,*p2,*head;
    n=0;
    p1=p2=(struct student *)malloc(sizeof(struct student));
    printf("input number & score of studnet:");
    scanf("%d %d",&p1->num,&p1->core);
    head=NULL;
    while(p1->num!=0){
        n=n+1;
        if(n==1){
            head=p1;
        }
        else{
            p2->next=p1;
        }
        p2=p1;
        p1=(struct student *)malloc(sizeof(struct student));
        printf("input number & score of student:");
        scanf("%d %d",&p1->num,&p1->core);
    }
    p2->next=NULL;
    return head;
}
struct student * insert(struct student * ah,struct student * bh){
    struct student * pa1,* pa2,* pb1,* pb2;
    pa2=pa1=ah;//将a的两个指针都指向开头
    pb2=pb1=bh;//将b的两个指针都指向开头
    do{
        while((pb1->num>pa1->num)&&(pa1->next!=NULL)){//当a的学号小于b的学号时并且a没有结束
            pa2=pa1;
            pa1=pa1->next;//pa1和pa2均向后移一位,直到找到比b的学号大的位置pa1;
        }
        if(pb1->num<=pa1->num){//如果找到了比pa1所指位置学号更小的,而不是到达a的末尾。
            if(ah==pa1){//如果第一个节点就比b大,直接将a的头结点指向b;
                ah=pb1;
            }
            else{
                pa2->next=pb1;//pa2指向的是pa1前面的位置,所以用pa2指向比pa1小的pb1;
            }
            pb1=pb1->next;//pb1作为判断的任务结束,移动到下一个节点准备做判断;
            pb2->next=pa1;//将pb2和pa1连接即可形成一整条;
            pa2=pb2;//前面已经连接好,将pa2前移一个位置,
            pb2=pb1;//pb2的定位任务完成,指向下一个节点准备下一次判断;
        }
    }while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
    if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))//如果a表已经走完了而b表还没走完,将b的后面直接连接起来
    pa1->next=pb1;
    return ah;
}
void print(struct student * head){
    struct student *p;
    p=head;
    printf("There are %d records:\n",sum);
    if(p!=NULL){
        do{
            printf("%d %d\n",p->num,p->core);
            p=p->next;
        }while(p!=NULL);
    }
}