1. 程式人生 > >兩個單鏈表的合併(C語言實現)

兩個單鏈表的合併(C語言實現)

單鏈表的合併還是挺簡單的,直接上程式碼吧。

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;
List Read(); /* 連結串列讀取 */
void Print( List L ); /*連結串列輸出;空連結串列將輸出NULL */
List Merge( List
L1, List L2 );  /*連結串列合併*/ int main() {     List L1, L2, L;     L1 = Read();  //讀取連結串列1     L2 = Read();  //讀取連結串列2     L = Merge(L1, L2);      Print(L);     Print(L1);     Print(L2);     return 0; } List Merge( List L1, List L2 ) {     List L, p1, p2, r ;     p1 = L1->Next;     p2 = L2->Next;     L =
(List)malloc(sizeof(struct Node));     L->Next = NULL;     r = L;     while (p1 && p2){         if(p1->Data < p2->Data){             r->Next = p1;             r = p1;             p1 = p1->Next;         }         else{             r->Next = p2;             r = p2;             p2 =
p2->Next;         }     }     if(p1)         r->Next = p1;     else         r->Next = p2;  L1->Next = NULL;  L2->Next = NULL;  return L; } List Read() {     int n, i;     List L, p, s;     scanf("%d",&n);     L = (List)malloc(sizeof(struct Node));     L->Next = NULL;     p = L;     for(i = 0;i < n; ++i){         s = (List)malloc(sizeof(struct Node));         scanf("%d",&s->Data);         s->Next = p->Next;         p->Next = s;         p = s;     }     return L; } void Print(List L) {  List p;  p = L->Next;  if (L->Next==NULL)  {   printf("NULL");  }  while(p)  {   printf("%d ", p->Data);   p = p->Next;  }  printf("\n"); }