数据结构—带头结点单链表的合并

单链表的合并

  • 一般单链表的合并和前一篇博客写的但循环链表的合并思路基本一致,区别在于合并后不用将最后一个结点的指针域指向头结点。
void Combine(LinkList L1, LinkList L2) 
{
	LNode *p1;
	LNode *p2;
	p1 = L1->next;
	p2 = L2->next;
	LNode *s1, *s2;
	while (p1) 
	{
		if (p1->next == NULL) 
		{
			s1 = p1;
			break;
		}
		p1 = p1->next;
	}
	while (p2) 
	{
		if (p2->next == NULL)
		{
			s2 = p2;
			break;
		}
		p2 = p2->next;
	}
	s1->next = L2->next;   // L1尾部接到L2首元结点
	delete(L2);

}

代码实现

  • main.cpp
#include

using namespace std;

typedef struct LNode 
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

int InitList(LinkList &L) 
{
	L = new LNode;
	L->next = NULL;
	
	return 1;
}

int ListLength(LinkList L) 
{
	int length = 0;
	LNode *p;
	p = L->next;
	
	while (p) 
	{
		p = p->next;
		length++;
	}
	return length;
}

void TraveList(LinkList L) 
{
	LNode *p;
	p = L->next;
	
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

//使用后插法创建单链表 
void CreateList(LinkList &L, int n) 
{
	L = new LNode;
	L->next = NULL;
	LNode *r;
	r = L;
	for (int i = 0; i < n; i++) 
	{
		printf("请输入第%d个元素值:", i + 1);
		LNode *p;
		p = new LNode;
		scanf("%d", &p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

void Combine(LinkList L1, LinkList L2) 
{
	LNode *p1;
	LNode *p2;
	p1 = L1->next;
	p2 = L2->next;
	LNode *s1, *s2;
	while (p1) 
	{
		if (p1->next == NULL) 
		{
			s1 = p1;
			break;
		}
		p1 = p1->next;
	}
	while (p2) 
	{
		if (p2->next == NULL)
		{
			s2 = p2;
			break;
		}
		p2 = p2->next;
	}
	s1->next = L2->next;   // L1尾部接到L2首元结点
	delete(L2);    // 释放L2头结点

}

int main() 
{
	LinkList A;
	LinkList B;

	if (InitList(A)) 
	{
		printf("链表A初始化成功!\n");
	}
	else 
	{
		printf("链表初始化失败!\n");
	}

	if (InitList(B)) 
	{
		printf("链表B初始化成功!\n");
	}
	else
	{
		printf("链表B初始化失败!\n");
	}

	printf("请输入链表A的长度:");
	int n1;
	scanf("%d", &n1);
	CreateList(A, n1);
	printf("遍历链表A:\n");
	TraveList(A);
	printf("链表A的长度:%d\n", ListLength(A));

	printf("请输入链表B的长度:");
	int n2;
	scanf("%d", &n2);
	CreateList(B, n2);
	printf("遍历链表B:\n");
	TraveList(B);

	printf("合并后的链表:\n");
	Combine(A, B);
	TraveList(A);
	printf("合并后的链表长度是:%d\n", ListLength(A));

	system("pause");

	return 0;
}
  • 运行结果

数据结构—带头结点单链表的合并_第1张图片

 

 

 

你可能感兴趣的:(数据结构)