【数据结构】循环链表和非循环单链表的区别

注意:这里的循环链表是以尾指针为起始。

非循环单链表判断结束的标志为指针为空。而循环链表判断结束的标志是指针不是头节点。

在插入操作中,非循环单链表判断循环结束是指针为空。若循环结束后,发现指针变为空,说明要求插入的位置不合理:位置大于Length+1。

bool  insert(LinkList *L, int target, int data)
{
	if (target < 1)
	{
		cout << "insert erro" << endl;
		return false;
	}
	else
	{
		int now = 1;
		LinkList p = *L;

		while (now < target&&p != NULL)
		{
			now++;
			p = p->next;
		}
		if (p == NULL)
		{
			cout << "insert erro" << endl;
			return false;
		}

		LinkList s = (LinkList)malloc(sizeof(Node));
		s->data = data;
		s->next = p->next;
		p->next = s;

		return true;

	}



	return true;
}

带有尾指针的循环链表:由于判断链表空的条件指针等于头指针。如果用非循环链表的循环条件,会导致错误:假设使用单链表的方法插入,初始时候链表空,要插入第一个节点时,因为链表空和位置就是为1,的原因,循环结束。又进行了是否为空的判断,空就提示错误。此时,由于链表是空的,指针指向头指针,而判断空的条件为指针指向头指针即为空,所以不允许插入操作。这个是有问题的。

于是我们做出了改进:指针的下一位指针指向头指针或者j==目标地址就结束循环。但是循环以后的判断条件改为了如果j!=目标地址。

原因如下:此时,循环因为指针的下一位是头指针而结束循环的情况只有4种

1.表空,目标地址为1,此时j为1

2.表空,目标地址大于1,此时j为1

3.目标地址为Length+1,此时j==length+1

4.目标地址大于Length+1,此时j==length+1

其中合理的情况为1和3。所以当j!=location时,不合理。


bool insert(LinkList *L, int location, int data)
{
	//位置问题
	if (location < 1)
	{
		cout << "erro" << endl;
		return false;
	}

	LinkList p = *L;
	int j = 1;
	p = p->next;//指向头指针


	//注意与非循环链表的判断区别
	while (p->next!= (*L)->next&&j < location)
	{
		p = p->next;
		j++;
	}

	//位置大于实际长度
	//循环链表的时候,当p所指的链表为空,是可以插入的。
	//但是非循环链表,当p所指的地址为空,不可以插入。
	if (j!=location)
	{
		cout << "erro" << endl;
		return false;
	}

	LinkList temp = p->next;
	LinkList s = (LinkList)malloc(sizeof(Node));
	s->data = data;
	p->next = s;
	s->next = temp;
	if (p == *L)
	{
		*L = s;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值