C语言实现单向循环链表

发布时间:2024年01月13日

1.C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义一个节点类
typedef struct Node {
	int data;// 数据域
	struct Node* next;// 指针域
}Node;
// 定义初始化链表方法
Node* initList() {
	Node* list = (Node*)malloc(sizeof(Node));
	list->data = 0;// 虚拟头节点的数据域储存的是链表的长度
	list->next = list;// 虚拟头节点自己指向自己
	return list;
}
// 定义头插方法
void headInsert(int data, Node* list) {
	Node* newHead = (Node*)malloc(sizeof(Node));
	newHead->data = data;
	newHead->next = list->next;
	list->next = newHead;
	// 更新链表长度
	list->data++;
}
// 定义尾插方法
void tailInsert(int data, Node* list) {
	Node* node = (Node*)malloc(sizeof(Node));
	// 寻找链表的尾节点
	Node* tail = list;
	while (tail->next != list) {
		tail = tail->next;
	}
	node->data = data;
	node->next = list;
	tail->next = node;
	// 更新链表长度
	list->data++;
}
// 定义删除方法
bool delete(int data, Node* list) {
	Node* pre = list;
	Node* cur = list->next;
	while (cur != list) {
		if (cur->data == data) {
			pre->next = cur->next;
			free(cur);
			// 更新链表长度
			list->data--;
			// 通过返回值true标识找到了第一个符合条件的节点 标识删除成功
			return true;
		}
		pre = cur;
		cur = cur->next;
	}
	// 如果遍历了整个链表都没有找到指定值对应的节点的话 那么就说明删除失败
	return false;
}
// 定义打印方法
void printList(Node* list) {
	Node* cur = list->next;
	// 他有别于单向链表的打印方法 是因为如果你条件设置为当非空的时候停止循环的话 那么他永远都无法停止循环 而是陷入了死循环 所以你得设置为当下一个节点为虚拟头节点的时候停止循环才行
	while (cur != list) {
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}
// 定义一个主函数
int main() {
	Node* list = initList();
	headInsert(1, list);
	headInsert(2, list);
	headInsert(3, list);
	headInsert(4, list);
	tailInsert(5, list);
	printList(list);// 4 3 2 1 5
	if (delete(4, list) == true) {
		printf("删除成功\n");
	}
	else {
		printf("删除失败\n");
	}
	printList(list);// 3 2 1 5
	printf("%d\n", list->data);// 4
	return 0;
}

测试结果来看 这个链表是经得住考验的

文章来源:https://blog.csdn.net/m0_71299382/article/details/135570052
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。