C语言循环链表(尾指针),含链表的头插,尾插,合并

C语言循环链表(尾指针),含链表的头插,尾插,合并

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

//带头节点的循环链表
typedef struct Lnode {
	struct Lnode* next;
	int data;
} Lnode, *linkList;

//循环链表的初始化
void initLink(linkList* tail) {
	 *tail = (linkList)malloc(sizeof(Lnode));		//创建一个头节点
	 (*tail)->data = NULL;
	 (*tail)->next = *tail;
}

//循环链表的插入(头插)
void insertLinkhHead(linkList* tail, int e) {
	Lnode* node = (Lnode*)malloc(sizeof(Lnode));
	node->data = e;
	if ((*tail)->next == (*tail))
	{
		//没有节点
		node->next = *tail;
		(*tail)->next = node;
		*tail = node;
	}
	else
	{
		//已经有了节点
		node->next = (*tail)->next->next;
		(*tail)->next->next = node;
	}
}

//循环链表的插入(尾插)
void insertLinkTail(linkList* tail, int e) {
	Lnode* node = (Lnode*)malloc(sizeof(Lnode));
	node->data = e;
	node->next = (*tail)->next;
	(*tail)->next = node;
	*tail = node;
}

//循环链表的遍历
void show(Lnode* tail) {
	if (tail->next == tail)
	{
		printf("链表中没有元素\n");
	}
	else
	{
		Lnode* p = tail->next->next;
		int i = 0;
		while (p != tail->next)
		{
			printf("链表中的第%d个元素是%d\n", i++, p->data);
			p = p->next;
		}
	}
}

//循环链表的合并
void merage(linkList* tail1, linkList* tail2) {
	linkList* p = (*tail1)->next;
	(*tail1)->next = (*tail2)->next->next;
	free((*tail2)->next);
	(*tail2)->next = p;
}

void main() {
	linkList tail;
	initLink(&tail);
	for (int i = 0; i < 5; i++)
	{
		insertLinkhHead(&tail, i);
	}

	show(tail);
	for (int i = 5; i < 10; i++)
	{
		insertLinkTail(&tail, i);
	}

	show(tail);
	printf("测试循环链表的合并\n");

	linkList tail02;
	initLink(&tail02);
	for (int i = 20; i < 25; i++)
	{
		insertLinkhHead(&tail02, i);
	}
	show(tail02);
	printf("合并==start==\n");
	merage(&tail, &tail02);
	show(tail02);
	printf("合并==end==\n");
}
C语言中,链表是一种动态数据结构,常用于存储一系列元素,不需要预先确定其大小。法(insert at head)和法(insert at tail)是链表操作的基本方法。 1. **法(Insert at Head)**: - 函数原型通常可以这样定义:`void insertAtHead(struct Node* *head, int data)`,其中`struct Node* *head`是节点指针指针,`data`是要入的新值。 - 创建一个新的节点,并将其`next`字段设置为原来的节点。 - 更新节点指针指向新节点。 - 如果节点本身就是新创建的,则不会改变原有链表。 2. **法(Insert at Tail)**: - 函数原型类似:`void insertAtTail(struct Node* *head, int data)`。 - 步骤: - 创建新的节点并将它设为`NULL`,然后将新节点的`next`指针设置为当前最后一个节点。 - 如果链表为空(即节点`*head`为`NULL`),则新节点同时作为节点和节点。 - 否则,遍历链表找到最后一个节点并更新它的`next`指针。 下面是一个简单的示例代码片段: ```c // 假设链表节点结构如下 typedef struct Node { int data; struct Node* next; } Node; // 法函数 void insertAtHead(Node** head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = *head; *head = newNode; } // 法函数 void insertAtTail(Node** head, int data) { if (*head == NULL) { insertAtHead(head, data); } else { Node* current = *head; while (current->next != NULL) current = current->next; current->next = (Node*)malloc(sizeof(Node)); current->next->data = data; current->next->next = NULL; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值