数据结构—只设置尾指针而不设置头指针的循环链表的合并

循环链表合并(只带尾指针)

  • 对循环链表,有时不给出头指针,而给出尾指针可以更方便的找到第一个和最后一个结点。

  • 如何查找开始结点和终端结点?
    • 开始结点:rear->next->next
    • 终端结点:rear
  • 循环链表的合并:

void  Combine(LinkListLast Ta, LinkListLast Tb) 
{
	LNode *p;
	p = Ta.rear->next;                   // 保存Ta存表头结点
	Ta.rear->next = Tb.rear->next->next;   // Ta表尾连结Tb首元结点
	delete(Tb.rear->next);          // ③释放Tb表头结点
	Tb.rear->next = p;            // ④Tb表尾连接Ta表头
}

代码实现

  • main.cpp
  • #include<iostream>
    
    using namespace std;
    
    typedef struct LNode 
    {
    	int data;
    	struct LNode *next;
    }LNode;
    
    //定义尾指针 
    typedef struct 
    {
    	LNode *rear;
    }LinkListLast;
    
    //初始化 
    int InitList(LinkListLast &L) 
    {
    	L.rear = new LNode;
    	L.rear->next = L.rear;
    	
    	return 1;
    }
    
    // 尾插法创建单循环链表
    void CreateList(LinkListLast &L, int n)
    {
    	L.rear = new LNode;
    	L.rear->next = L.rear;
    	
    	printf("请输入链表元素值:\n");
    	for (int i = 0; i < n; i++)
    	{
    		printf("请输入第%d个元素的值:", i + 1);
    		LNode *p;
    		p = new LNode;
    		scanf("%d", &p->data);
    		p->next = L.rear->next;
    		L.rear->next = p;
    		L.rear = p;	
    	}
    }
    
    // 获取链表长度
    int ListLength(LinkListLast L)
    {
    	int length = 0;
    	LNode *p;
    	p = L.rear->next->next;
    	while (p != L.rear->next)
    	{                           //  当p不是头结点时,链表长度加1 
    		p = p->next;
    		length++;
    	}
    
    	return length;
    }
    
    // 遍历
    void TraveList(LinkListLast L) 
    {
    	LNode *p;
    	p = L.rear->next->next;
    
    	while (p != L.rear->next) 
    	{
    		printf("%d ", p->data);
    		p = p->next;
    	}
    	
    	printf("\n");
    }
    
    /*
    设置尾指针的循环链表的合并只需要改变两个指向表尾的指针即可。
    */
    void  Combine(LinkListLast L1, LinkListLast L2) 
    {
    	LNode *p;
    	p = L1.rear->next;                   // 保存L1存表头结点
    	L1.rear->next = L2.rear->next->next;   // L1表尾连结L2首元结点
    	delete(L2.rear->next);          // ③释放L2表头结点
    	L2.rear->next = p;            // ④L2表尾连接L1表头
    }
    
    int main() 
    {
    	LinkListLast A;
    	LinkListLast B;
    	if (InitList(A))
    	{
    		printf("链表A初始化成功!\n");
    	}
    	else 
    	{
    		printf("链表A初始化失败!\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("请输入链表B的元素个数:");
    	int n2;
    	scanf("%d", &n2);
    	CreateList(B, n2);
    	printf("遍历链表B:\n");
    	TraveList(B);
    
    	printf("合并A、B:\n");
    	Combine(A, B);
    	printf("当前链表长度:%d\n", ListLength(B));
    	printf("遍历链表A+B:\n");
    	TraveList(B);   // 由于只有尾指针,所以遍历合并后的链表要从第二个链表开始 
    
    	system("pause");
    
    	return 0;
    }
    运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值