【数据结构】带尾节点的循环链表

本文介绍了一个简单的单链表实现,包括初始化、插入、显示和删除等基本操作。通过具体的C++代码示例,详细解释了每种操作的具体实现方式。
#include<iostream>
using namespace std;

struct Node
{
	int data;
	Node *next;
};

typedef Node* LinkList;

void init(LinkList *L);
bool insert(LinkList *L, int location, int data);
void show(LinkList L);
bool Delete(LinkList *L, int location);

int main()
{
	LinkList List;
	init(&List);
	for (int i = 1; i <= 10; i++)
	{
		insert(&List, i, i);
	}
	 show(List);
	 cout << List->data << endl;

	system("pause");
	return 0;
}

//初始化的时候,应该制造一个节点
void init(LinkList *L)
{
	LinkList s = (LinkList)malloc(sizeof(Node));
	s->data = -1;
	*L = s;
	s->next = *L;
}

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;
	}
}

void show(LinkList L)
{
	LinkList p = L->next->next;
	cout << "display: ";
	while (p != L->next)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

bool Delete(LinkList *L, int location)
{
	LinkList p = (*L)->next;//指向头指针
	if (p->next == *L|| location<1)
	{
		cout << "erro" << endl;
		return false;
	}

	int j = 1;
	while (p->next != (*L)->next&&j < location)
	{
		j++;
		p = p->next;
	}

	if (p->next == (*L)->next)
	{
		cout << "erro" << endl;
		return false;
	}

	LinkList temp = p->next;
	p->next = temp->next;
	if (temp == *L)
	{
		*L = p;
	}
	free(temp);
	return true;

}
//链表1的尾节点插在链表2的第一个节点前。链表2的尾节点指向链表1的头节点。将链表2的尾节点作为新链表的尾节点。释放链表2的头节点。
//特别注意的是,链表2不能为空,否则会出错:因为我们要删除链表2的头节点。
//链表1可为空,但是这样做相当于把链表2的地址更改为链表1的地址。
bool emerge(LinkList *L1, LinkList *L2, LinkList *L3)
{
	LinkList List2 = *L2;//尾节点
	LinkList List1 = *L1;//尾节点
	LinkList List1_head = List1->next;//备份链表1的头节点
	if (isEmpty(List2) == true)
	{
		cout << "erro" << endl;
		return false;
	}

	LinkList temp = List2->next;//链表2的头结点
	List1->next = temp->next;//链表1的尾节点的next指针指向链表2的首节点
	List2->next = List1_head;//链表2的尾节点的next指针指向链表1的头节点
	*L3 = List2;//新链表的尾节点为链表2的尾节点
	free(temp);
	return true;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值