兩個鏈表的合併

主要功能:

實現兩個鏈表的合併

基本功能要求:

1)建立兩個鏈表AB,鏈表元個數分別爲mn個。

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

測試數據:

1) A表(304115125680

B表(235678231233799055

2) A表(304115125680231234

B表(2356782312

代碼:

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>

#include <stdlib.h>


typedef int DataType;


typedef struct Node

{

DataType data;

struct Node *next;

}Node, *LinkList;


//初始化

void InitList(LinkList &head)

{

head = (LinkList)malloc(sizeof(Node));

head->next = NULL;

}


//輸出鏈表

void Print(LinkList head)

{

head = head->next;

while (head != NULL)

{

printf("%d", head->data);

if (head->next != NULL)

{

printf("->");

}

head = head->next;

}

}


//尾插建鏈表

void CreateFromTail(LinkList &head)

{

DataType val = 0;

Node *r = head;

do{

scanf("%d", &val);

if (val != 0)

{

Node *s = (Node *)malloc(sizeof(Node));

s->data = val;

r->next = s;

r = s;

}

else

{

r->next = NULL;

}

} while (val != 0);

}/*CreateFromTail*/


//求長度

int LinkListLength(LinkList head)

{

Node *LA = head;

int len = 0;

head = head->next;

while (head != NULL)

{

len++;

head = head->next;

}

return len;

}/*LinkListLength*/


void Merge(LinkList headA, LinkList headB, LinkList &headC)

{

int count = 0;

while (headB)

{

Node *s = (Node *)malloc(sizeof(Node));

if (count % 2 == 0)

{

s->data = headA->data;

headC->next = s;

headA = headA->next;

}

else

{

s->data = headB->data;

headC->next = s;

headB = headB->next;

}

headC = headC->next;

count++;

}

while (headA)

{

Node *s = (Node *)malloc(sizeof(Node));

s->data = headA->data;

headC->next = s;

headC = headC->next;

headA = headA->next;

}

headC->next = NULL;

}/*Merge*/


//合併鏈表

void MerLinkList(LinkList headA, LinkList headB, LinkList &headC)

{

Node *LA = headA->next;

Node *LB = headB->next;

Node *LC = headC;

int lenA = LinkListLength(LA);

int lenB = LinkListLength(LB);

if (lenA >= lenB)

{

Merge(LA, LB, LC);

}/*if (lenA >= lenB)*/

else

{

Merge(LB, LA, LC);

}

}/*MerLinkList*/


int main()

{

LinkList headA;

LinkList headB;

LinkList headC;


//初始化

InitList(headA);

InitList(headB);

InitList(headC);


//尾差法建立鏈表

//建headA

printf("請輸入headA的元素,以0符結束:> ");

CreateFromTail(headA);

printf("\n");

//建headB

printf("請輸入headB的元素,以0符結束:> ");

CreateFromTail(headB);

printf("\n");


//合併A,B

MerLinkList(headA, headB, headC);


//輸出A,B,C

printf("A鏈表爲:> ");

Print(headA);

printf("\n");


printf("B鏈表爲:> ");

Print(headB);

printf("\n");


printf("C鏈表爲:> ");

Print(headC);

printf("\n");


system("pause");

return 0;

}

測試用例:

wKiom1aF9_-T4LL9AABAvsnYGDM923.png

wKioL1aF-HWTrWWHAABBO7rMubI975.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章