实现两个链表的合并 实训(1)

来源:互联网 发布:育知同创教育 编辑:程序博客网 时间:2024/06/15 10:51

1、实现两个链表的合并

【基本功能要求】

(1)建立两个链表A和B,链表元素的个数分别为m和n个;

(2)假设元素分布为(x1,x2,…,xm)、(y1,y2,…,yn)。把它们合并成一个线性表C,使得:

当m>=n时,C=(x1,y1,x2,y2,…,xn,yn,…,xm)

当n>m时,C=(y1,x1,y2,x2,…,ym,xm,…,yn)

输出线性表C;

(3)用冒泡排序法对C进行升序排序,生成表C,并输出表A、B、C、D。




#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

typedef struct data

{

         intnum;        

         structdata * next;

}Data, *pData;

 

 

pData bubbldsort(pData C)

{

         if(NULL==C->next)

         {

                   printf("C表为空,请返还输入\n");

                   returnNULL;

         }

 

         pDatamiddle;

         pDatap;

         pDataD;

         pDatap1;

 

         middle= (pData)malloc(sizeof(Data));     //建立D链表;

         middle->num= C->num;

         middle->next= NULL;

         D= middle;

         p= middle;

   

         middle= NULL;

         p1= C->next;

 

 

         while(NULL!=p1)

         {

                   middle= (pData)malloc(sizeof(Data));

                   middle->num= p1->num;

                   middle->next= NULL;

 

                   p->next= middle;

                   p= middle;

 

                   middle= NULL;

                   p1= p1->next;

         }

 

         intnum;

         for(middle=D->next; NULL!=middle->next; middle=middle->next)

         {

                  

                   for(p=middle->next; NULL!=p; p=p->next)

                   {

                            if(middle->num > p->num)                //这里只是交换数值,交换结点,请看第四题;

                            {

                                     num= p->num;

                                     p->num= middle->num;

                                     middle->num= num;

                            }

                   }

         }

 

         returnD;

}

 

pData create(void)   //新建链表;

{

         pDatamiddle;

         pDatals;

         pDatap;

 

         intn;

 

         printf("请输入表的数据长度:");

         scanf("%d",&n);

 

         middle= (pData)malloc(sizeof(Data));       //头结点;

         middle->num= n;                                                                //头结点的数据域用于存放长度n;

         middle->next= NULL;

         ls= middle;

         p= middle;

 

         middle= NULL;

 

   printf("请输入数据");

   while(n>0)

         {       

                   middle= (pData)malloc(sizeof(Data));

                  

                   scanf("%d",&middle->num);

                   middle->next= NULL;

                   p->next= middle;

                   p= middle;

                  

                   middle= NULL;

                   --n;

         }

 

         returnls;

 

}

 

 

void export(pData ls)

{

         if(NULL==ls->next)

         {       

                   printf("链表为空!");

                   return;

         }

 

          for (ls=ls->next; NULL!=ls; ls=ls->next)

          {

                    printf("%d\t", ls->num);

          }

 

          printf("\n");

 

}

 

 

pData merge(pData A, pData B)

{

         pDataC;

        

         if(NULL==A->next)

         {

                   C= A;

                   returnC;

         }

         if(NULL==B->next)

         {

                   C= B;

                   returnC;

         }

 

         pDatamiddle;

         pDatap;

 

         middle= (pData)malloc(sizeof(Data));   //头结点;

         middle->next= NULL;

         C= middle;

         p= middle;

         middle= NULL;

    

         intm;

         intn;

         m= A->num;

         n= B->num;

 

         A= A->next;

         B= B->next;

 

         if(m >= n)

         {

                   while(NULL != B)

                   {

                            middle= (pData)malloc(sizeof(Data));

                            middle->num= A->num;

                            middle->next= NULL;

                            p->next= middle;

                            p= p->next;

                           

                            middle= NULL;

                           

 

                            middle= (pData)malloc(sizeof(Data));

                       middle->num = B->num;

                            middle->next= NULL;

           p->next = middle;

                            p= p->next;

 

                            middle= NULL;

           

                            A= A->next;

                            B= B->next;

                   }

 

                   if(NULL== A)        

                   {

                            returnC;

                   }

                   else

                   {

                            while(NULL != A)

                            {

                                     middle= (pData)malloc(sizeof(Data));

                                     middle->num= A->num;

                                     middle->next= NULL;

                                     p->next= middle;

                                     p= p->next;

 

                                     middle = NULL;

                                     A= A->next;

                            }

                   }

         }

         else

         {

                   while(NULL != A)

                   {

                            middle= (pData)malloc(sizeof(Data));

                            middle->num= B->num;

                            middle->next= NULL;

                       p->next = middle;

                            p= p->next;

 

                            middle= NULL;

                           

                            middle= (pData)malloc(sizeof(Data));

                       middle->num = A->num;

                            middle->next= NULL;

           p->next = middle;

                            p= p->next;

 

                            middle= NULL;

           

                           

                            A= A->next;

                            B= B->next;

                   }

 

                   while(NULL != B)

                   {

                            middle= (pData)malloc(sizeof(Data));

                            middle->num= B->num;

                            middle->next= NULL;

                            p->next= middle;

                            p= p->next;

 

                            middle= NULL;

                            B= B->next;

                   }

 

         }

 

        

 

         returnC;

}

 

 

 

int main(void)

{

         pDataA, B;

 

         printf("建立A表!");

    A= create();        //建立A表;

         printf("建立B表!");

         B= create();        //建立B表;

 

         pDataC;

         C= merge(A, B);             //合并A、B表,生成C表;

         printf("链表C中的数据为\n");

         export(C);                   //输出C表;

 

         pDataD;

         D= bubbldsort(C);        //冒泡排序C表,生成D表;

         printf("链表D中的数据为\n");

         export(D);                //输出D表;

 

         printf("链表A中的数据为\n");

         export(A);               //输出A表;

 

         printf("链表B中的数据为\n");

         export(B);               //输出B表;

 

         printf("链表C中的数据为\n");

         export(C);               //输出C表;

 

         printf("链表D中的数据为\n");

         export(D);               //输出D表;

 

         return0;

}

原创粉丝点击