循环单链表的 初始化,头插法,尾插法,任意插法,以及打印出链表的所有元素的实现方法。

本文详细介绍了如何使用C++实现循环单链表的初始化、头插法、尾插法、任意位置插入以及遍历所有元素的方法。通过实例代码解析,帮助读者掌握循环单链表的基本操作。

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

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef struct Linked_list//创建链表结构体
{
	int data;
	Linked_list *next;

}Linked_list;

Linked_list* Linked_list_initialization(int n)//创建n个元素的链表并初始化
{
	if (n == 0)
		return 0;
	Linked_list* head = 0;
	Linked_list* middle;
	Linked_list* tail = NULL;
	for (int i = 0; i < n; i++)
	{
		middle = (Linked_list*)malloc(sizeof(Linked_list));
		if (i == 0)
			head = middle;
		middle->data = i;
		middle->next = head;
		if (0 < i)
			tail->next = middle;
		tail = middle;
	}
	return head;
}

void Print_the_linked_list(Linked_list* p)//打印n个链表的所有元素
{
	if (!p)
	{
		return;
	}
	Linked_list* a = p;
	do
	{
		if (a == p->next)
		{
			printf("%d,\n", p->data);
			return;
		}
		printf("%d,", p->data);
		p = p->next;
	} while (1);
	
}

void Plug_in_and_out(Linked_list* p)//任意插法
{
	int a;
	printf("请输入 要插入在第几个节点的后面->:");
	scanf_s("%d", &a);
	for (int i = 0; i < a - 1; i++)
	{
		p = p->next;
	}
	if (!p)
	{
		return;
	}
	Linked_list* middle = (Linked_list*)malloc(sizeof(Linked_list));
	printf("输入你要插入结点里元素的数值->:");
	scanf_s("%d", &a);
	middle->data = a;

	middle->next = p->next;
	p->next = middle;
}

void Head_plug(Linked_list** p)//头插法
{
	Linked_list* b = *p;
	int a;
	Linked_list* head = 0;
	head = (Linked_list*)malloc(sizeof(Linked_list));
	printf("输入你要插入头结点里元素的数值->:");
	scanf_s("%d", &a);
	head->data = a;
	head->next = *p;
	
	while (!((*p)->next == b))
	{
		(*p) = (*p)->next;
	}
	(*p)->next = head;
     *p = head;
}

void Tail_plug(Linked_list* p)//尾插法
{
	Linked_list* b = p;
	int a;
	Linked_list* tail = 0;
	tail = (Linked_list*)malloc(sizeof(Linked_list));
	printf("输入你要插入头结点里元素的数值->:");
	scanf_s("%d", &a);
	tail->data = a;
	tail->next = p;
	while (!((p)->next == b))
	{
		(p) = (p)->next;
	}
	 p->next = tail;
}

void Connected(Linked_list* p1, Linked_list* p2)//联合两个单循环链表
{
	Linked_list* a = p1;
	Linked_list* b = p2;
	while (!(p1->next == a))
	{
		p1 = p1->next;
	}
	p1->next = p2;

	while (!(p2->next == b))
	{
		p2 = p2->next;
	}
	p2->next = a;
}

void DEL(Linked_list* p)
{
	int a;
	printf("请输入你要删除的第几个元素。\n");
	scanf_s("%d", &a);
	for (int i = 0; i < a - 2; i++)
	{
		p = p->next;
	}
	Linked_list* tmp = p->next;
	p->next = p->next->next;
	free(tmp);
	printf("删除完成。\n");
}

int main()
{
	Linked_list*  s1 = Linked_list_initialization(1);//创建n个元素的链表并初始化

	Linked_list*  s2 = Linked_list_initialization(2);//创建n个元素的链表并初始化
	printf("打印链表s1里的所有元素。\n");
	Print_the_linked_list(s1);//打印n个链表的所有元素
	printf("打印链表s2里的所有元素。\n");
	Print_the_linked_list(s2);//打印n个链表的所有元素
	printf("将链表s1与链表s2 合为一个链表。\n");
	Connected(s1, s2);
	printf("打印合成后的链表。\n");
	Print_the_linked_list(s1);//打印n个链表的所有元素
	printf("在循环单向链表 头结点处增加一个元素。\n");
	Head_plug(&s1);//头插法
	printf("打印循环单向链表。\n");
	Print_the_linked_list(s1);//打印n个链表的所有元素
	printf("再循环单向链表 尾结点处增加一个元素。\n");
	Tail_plug(s1);//尾插法
	Print_the_linked_list(s1);//打印n个链表的所有元素
	printf("再循环单向链表 任意位置插入元素。\n");
	Plug_in_and_out(s1);//任意插法
	Print_the_linked_list(s1);//打印n个链表的所有元素
	DEL(s1);//
	Print_the_linked_list(s1);//打印n个链表的所有元素



	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值