主要功能:ide
實現兩個鏈表的合併測試
基本功能要求:spa
(1)創建兩個鏈表A和B,鏈表元素個數分別爲m和n個。blog
(2)假設元素分別爲(x1,x2,…xm),和(y1,y2, …yn)。把它們合併成一個線性表C,使得:get
當m>=n時,C=x1,y1,x2,y2,…xn,yn,…,xmit
當n>m時,C=y1,x1,y2,x2,…ym,xm,…,ynio
輸出線性表C:class
測試數據:List
1) A表(30,41,15,12,56,80)im
B表(23,56,78,23,12,33,79,90,55)
2) A表(30,41,15,12,56,80,23,12,34)
B表(23,56,78,23,12)
代碼:
#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;
}
測試用例: