链表合并
设线性表A=(a1, a2,…,am),B=(b1, b2,…,bn),试写一个按下列规则合并A、B为线性表C的算法,使得:
C= (a1, b1,…,am, bm, bm+1, …,bn) 当m≤n时;
或者
C= (a1, b1,…,an, bn, an+1, …,am) 当m>n时。
线性表A、B、C均以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。
函数的原型如下:void lnk_merge(LinkList A, LinkList B, LinkList C)
即将A和B合并为C,其中 C 已经被初始化为空单链表
相关定义如下:
struct _lnklist{
ElemType data;
struct _lnklist *next;
};
typedef struct _lnklist Node;
typedef struct _lnklist *LinkList;
提供代码
#include <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除,否则检查不通过
void lnk_merge(LinkList A, LinkList B, LinkList C) {
}
参考代码
/*
链表 合并
设线性表A=(a1, a2,…,am),B=(b1, b2,…,bn),试写一个按下列规则合并A、B为线性表C的算法,使得:
C= (a1, b1,…,am, bm, bm+1, …,bn) 当m≤n时;
或者
C= (a1, b1,…,an, bn, an+1, …,am) 当m>n时。
线性表A、B、C均以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。
函数的原型如下:
void lnk_merge(LinkList A, LinkList B, LinkList C)
即将A和B合并为C,其中 C 已经被初始化为空单链表
*/
/*
分析:三个链表都要改为带头结点的链表
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//#include "list.h" // 请不要删除,否则检查不通过
#define ElemType int
struct _lnklist {
ElemType data;
struct _lnklist* next;
};
typedef struct _lnklist Node;
typedef struct _lnklist* LinkList;
void lnk_merge(LinkList A, LinkList B, LinkList C) {
LinkList tmp = C;//记录最末尾的位置
LinkList tmpA = A->next;
LinkList tmpB = B->next;
while (1)
{
if (tmpA == NULL)
{
return C;
}
else
{
tmp->next = tmpA;
tmp = tmp->next;
tmpA = tmpA->next;
}
if (tmpB == NULL)
{
return C;
}
else
{
tmp->next = tmpB;
tmp = tmp->next;
tmpB = tmpB->next;
}
}
}
LinkList creatList()
{
LinkList Head = (LinkList)malloc(sizeof(Node) * 2);
if (Head == NULL) return NULL;
Head->next = NULL;
return Head;
}
void pushByEnd(LinkList L, int n)
{
LinkList Node = (LinkList)malloc(sizeof(Node) * 2);
if (Node == NULL) return;
while (L->next != NULL)
{
L = L->next;
}
L->next = Node;
Node->data = n;
Node->next = NULL;
}
void print(LinkList L)
{
L = L->next;
while (L->next != NULL)
{
printf("%d ", L->data);
L = L->next;
}
printf("%d ", L->data);
printf("\n");
}
int main()
{
printf("请输入从大到小的A链表,按回车输入下一个数字,按ctrl+z结束输入:>\n");
LinkList A = creatList();
if (A == NULL) return;
int n = 0;
while (scanf("%d", &n) != EOF)
{
pushByEnd(A, n);
}
print(A);
printf("请输入从大到小的B链表,按回车输入下一个数字,按ctrl+z结束输入:>\n");
LinkList B = creatList();
if (B == NULL) return;
while (scanf("%d", &n) != EOF)
{
pushByEnd(B, n);
}
print(B);
LinkList C = creatList();
lnk_merge(A, B, C);
print(C);
return 0;
}
手绘过程