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

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

struct student * create();
struct student * input();
void print(struct student *);
struct student * union_linktable(struct student *,struct student *);
struct student * insert(struct student *,struct student *);
int main(int argc,char *argv[])
{
    struct student *head1,*head2;
    printf("please input linktable1:\n");
    head1 = (struct student *)create();
    printf("the lintable1 data is \n");
    print(head1);
    printf("please input linktable2:\n");
    head2 = (struct student *)create();
    printf("the lintable2 data is \n");
    print(head2);
    printf("union linktable1 and linktable2:\n");
    head1 = union_linktable(head1,head2);
    print(head1);
    system("pause");
    return 0;
}

struct student * create()
{
       int n = 0;
       struct student *head;
       struct student *p1,*p2;
       head = NULL;
       do 
       {
          p1 = input();
          if (0 == p1->num)
          {
             break;
          }
          else
          {
              if (0 == n)
              {
                 head = p1;
              }
              else
              {
                  p2->next = p1;
              }
              p2 = p1;
              n++;
          }
       }while(1);
       p2->next = NULL;
       return head;
}

struct student * input()
{
       struct student *p;
       p = (struct student *)malloc(SIZE);
       printf("please input num,score:");
       scanf("%ld,%f",&p->num,&p->score);
       return p;
}

void print(struct student *head)
{
     struct student *p;
     p = head;
     if (head != NULL)
     {
        do
        {
          printf("num:%ld,score:%5.1f\n",p->num,p->score);
          p = p->next;
        }while(p != NULL);
     }
     else
     {
         printf("error:linktable data is NULL.\n");
     }
}

struct student * union_linktable(struct student *head1,struct student *head2)
{
       struct student *pa1,*pa2,*pb1,*pb2;
       pa1 = pa2 = head1;
       pb1 = pb2 = head2;
       do
       {
         while ((pb1->num > pa1->num) && (pa1->next) != NULL)
         {
               pa2 = pa1;
               pa1 = pa1->next;
         }
         if (pb1->num <= pa1->num)
         {
            if(head1 == pa1)
            {
                     head1 = pb1;
            }
            else
            {
                pa2->next = pb1;
            }
            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 head1;
}

struct student *insert(struct student *head,struct student *stu)
{
       
       struct student *p0,*p1,*p2;
       p1 = head;
       p0 = stu;
       if(NULL == head)
       {
               head = p0;
               p0->next = NULL;
               
       }
       else
       {
           while (p0->num > p1->num && p1->next != NULL)
           {
                 p2 = p1;
                 p1 = p1->next;
           }
           if (p0->num <= p1->num)
           {
              if (p1 == head)
              {
                 head = p0;
              }
              else
              {
                  p2->next = p0;
              }
              p0->next = p1;
           }
           else
           {
               p1->next = p0;
               p0->next = NULL;
           } 
       }
       return head;
}

posted @   aspirant  阅读(4899)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示