链式表示的线性表之二——循环单链表1——拆分循环单链表(数值型)

本文介绍了一种算法,用于将包含整数和负数的循环单链表分拆成两个独立的循环单链表,一个仅包含正数,另一个仅包含负数。通过遍历链表并根据节点数据的正负性重新连接节点,实现了这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环单链表(circular linked list)是一种首尾相连的单链表。将单链表的最后一个结点的指针域由空指针改为指向头结点或第一个结点,整个链表就形成了一个环,我们称这样的单链表为循环单链表。
与单链表相似,循环单链表也可分为带头结点结构和不带头结点结构两种。对于不带头结点的循环单链表,当表不为空时,最后一个结点的指针域指向头结点。如图所示。

对于带头结点的循环单链表,当表为空时,头结点的指针域指头结点本身。如图所示。

 已知一个带哨兵结点h的循环单链表中的数据元素含有整数和负数,试编写另一个算法,构造两个循环单链表,使一个单链表中只含正数,另一个循环单链表只含负数。例如创建一个循环单链表{55,106,-29,-203,761,329,-76,432,87},分拆后变成两个循环单链表,一个只含正数,另一个只含负数,即{55,106,761,329,432}和{-29,-203,-76}

在输出循环单链表时要注意判决条件为

while(p->next!=head)

否则就会出现死循环。 

main.cpp

#include <iostream>
#include <malloc.h>
#include <stdlib.h>
using namespace std;

typedef int DataType;
typedef struct Node
{
	DataType data;
	struct Node *next;
}ListNode,*LinkList;

LinkList CreateCycList();
void Split(LinkList ha, LinkList hb);
void DispCycList(LinkList head);

void main()
{
	LinkList ha, hb = NULL;
	ListNode *s, *p;
	ha = CreateCycList();
	p = ha;
	while (p->next!=ha)
	{
		p = p->next;
	}
	s = (ListNode *)malloc(sizeof(ListNode));
	s->next = ha;
	ha = s;
	p->next = ha;
	s = (ListNode*)malloc(sizeof(ListNode));
	s->next = hb;
	hb = s;

	Split(ha, hb);

	cout << "输出循环单链表A(正数):" << endl;
	DispCycList(ha);
	cout << "输出循环单链表B(负数):" << endl;
	DispCycList(hb);
	
	system("pause");
}
void Split(LinkList ha, LinkList hb)
{
	ListNode *ra, *rb, *p = ha->next;
	int v;
	ra = ha;
	ra->next = NULL;
	rb = hb;
	rb->next = NULL;
	while (p!=ha)
	{
		v = p->data;
		if (v>0)
		{
			ra->next = p;
			ra = p;
		}
		else
		{
			rb->next = p;
			rb = p;
		}
		p = p->next;
	}

	ra->next = ha;
	rb->next = hb;
}

LinkList CreateCycList()
{
	ListNode *h = NULL, *s, *t = NULL;
	DataType e;
	int i = 1;
	cout << "创建一个循环链表(输入0表示创建链表结束):" << endl;
	while (1)
	{
		cout << "请输入第"<<i<<"个结点的data域值:"<< endl;
		scanf("%d", &e);
		if (e==0)
		{
			break;
		}
		if (i==1)
		{
			h = (ListNode*)malloc(sizeof(ListNode));
			h->data = e;
			h->next = NULL;
			t = h;
		}
		else
		{
			s = (ListNode*)malloc(sizeof(ListNode));
			s->data = e;
			s->next = NULL;
			t->next = s;
			t = s;

		}
		i++;

	}
	if (t!=NULL)
	{
		t->next = h;
	}
	return h;
}

void DispCycList(LinkList h)
{
	ListNode *p = h->next;
	if (p==NULL)
	{
		cout << "链表为空!" << endl;
		return;
	}
	while (p->next!=h)
	{
		cout << p->data << endl;
		p = p->next;
	}

	cout << p->data << endl;

}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值