1. 程式人生 > >資料結構_兩個有序單鏈表歸併C語言原始碼

資料結構_兩個有序單鏈表歸併C語言原始碼

#include<stdio.h>
#include<stdlib.h>


typedef struct LNode
{
  int data;
  struct LNode *next;;
}LNode;
    
void InitList(LNode *&L)
{
     L=(LNode*)malloc(sizeof(LNode));
     L->next=NULL;
}
    
void  CreateListR(LNode *&L,int a[],int n)
{
      int i;
      LNode *r=L,*s=NULL;
      for(i=0;i<n;i++)
      {
        s=(LNode*)malloc(sizeof(LNode));
        s->data=a[i];
        r->next=s;
        r=s;
      }
      r->next=NULL;
}


void VisitList(LNode *L)
{
     LNode *s=L->next;
     while(NULL!=s)
     {
       printf("%d\n",s->data);
       s=s->next;
     }
}


void ListDelete(LNode *&L,int elem)
{
     
     LNode *s=L;
     LNode *q=NULL;
     while(s->next!=NULL) 
     {
       if(s->next->data==elem)
       {
        q=s->next;
        s->next=q->next;
        free(q);
        return ;
       }
       s=s->next;
     }
}


void MergeListR(LNode *A,LNode *B,LNode* &C)//採用尾插法建表的連結串列歸併 演算法 (A,B為遞增連結串列,C要求為單調不減連結串列)
{
     LNode *r=NULL; 
     LNode *p=A->next;
     LNode *q=B->next;
     C=A;
     C->next=NULL;
     r=C;
     free(B);
     //B=NULL;
    
     while(p!=NULL && q!=NULL)
     {
       if(p->data <= q->data)
       {
         r->next=p;
         
         r=p;
         p=p->next;
       }
       else
       {
           r->next=q;
          
           r=q;
            q=q->next;
       }
       r->next=NULL;
     }
     
     if(NULL==p)
     {
       r->next=q;
       
     }
     else
     {
          r->next=p;
     } 
     
}


int main(void)
{
    const int N=5;
    
    int a[N]={2,3,4,5,6};
    int b[N]={2,4,7,8,9};
    LNode *L,*S,*T;
    InitList(L);
    InitList(S);
    CreateListR(L,a,N);
    CreateListR(S,b,N);
    VisitList(L);
    putchar(10);
    VisitList(S);
    MergeListR(L,S,T);
    VisitList(T); 
    
    
    system("pause");
    return 0;
}