两个链表的合并
2016-05-29 21:35
399 查看
主要功能:
实现两个链表的合并
基本功能要求:
(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:
测试数据:
1) A表(30,41,15,12,56,80)
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;
}
测试用例:
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/79/0C/wKiom1aF9_-T4LL9AABAvsnYGDM923.png" title="M1L(QGO66526VA_K0WUFPS2.png" alt="wKiom1aF9_-T4LL9AABAvsnYGDM923.png" />
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/79/0B/wKioL1aF-HWTrWWHAABBO7rMubI975.png" title="YX`PKQWNM`LKDJMO9DS[P@B.png " alt="wKioL1aF-HWTrWWHAABBO7rMubI975.png" />
实现两个链表的合并
基本功能要求:
(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:
测试数据:
1) A表(30,41,15,12,56,80)
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;
}
测试用例:
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/79/0C/wKiom1aF9_-T4LL9AABAvsnYGDM923.png" title="M1L(QGO66526VA_K0WUFPS2.png" alt="wKiom1aF9_-T4LL9AABAvsnYGDM923.png" />
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/79/0B/wKioL1aF-HWTrWWHAABBO7rMubI975.png" title="YX`PKQWNM`LKDJMO9DS[P@B.png " alt="wKioL1aF-HWTrWWHAABBO7rMubI975.png" />
相关文章推荐
- 单链表的操作
- 单继承与多继承中的虚函数表和虚函数指针
- C++虚继承中的对象内存布局
- 大道至简阅读笔记01
- shell(十一)切割文件
- [DP] BZOJ 1270 [BeijingWc2008]雷涛的小猫
- HttpClient get请求在HttpResponse中无法获得Location的问题
- 循环
- 天梯匹配系统 - 简单实现
- [平衡树动态维护凸包] BZOJ 2300 [HAOI2011]防线修建
- hdu 4607(树的直径)
- 学习进度条13
- C语言编程经验总结
- 关于在配置hexo中遇到的问题
- 看了下微软更新的Win10系统,特地开了个UWP目录,与大家交流UWP开发
- 寻找数组中的众数
- E: Sub-process /usr/bin/dpkg returned an error code (1) 出错解决方案
- 1008 Problem H
- 易生活(三)-APP—ninegridview源码阅读
- 模块