欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言-双向循环链表

程序员文章站 2024-03-22 11:42:40
...

功能:实现双向循环链表做数据插入,删除使用

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RET_OK 1
#define RET_ERROR 0

#define UDPLEN 1024

//链表的类型
typedef struct LNode {
	char data[UDPLEN];
	struct LNode* prior;
	struct LNode* next;
} LNode, * LinkList;

//创建头节点
LinkList create_list() 
{
	
	LNode* L;

	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL) return NULL;
	L->next = L;
	L->prior = L;
	memset(L->data, '\0', UDPLEN);

	return L;
}

//创建单个节点
LinkList create_node(const char *udp_data)
{
	LinkList node = (LNode*)malloc(sizeof(LNode));
	if (node == NULL) return NULL;

	strncpy(node->data, udp_data, strlen(udp_data));
	node->next = NULL;
	node->prior = NULL;

	return node;
}

//从链表末尾入链表,尾插法
int push_list(LinkList L, const char *udp_data)
{
	LinkList node = NULL;
	node = create_node(udp_data);

	//没有头节点
	if (NULL == L)
	{
		L = create_list();
		if (L == NULL) return RET_ERROR;
		
		L->next = node;
		L->prior = node;
		node->prior = L;
		node->next = L;
	}
	//只有头节点
	else if (L == L->next)
	{
		L->next = node;
		L->prior = node;
		node->prior = L;
		node->next = L;
	}
	else
	{
		L->prior->next = node;
		L->prior = node;
		node->prior = L->prior;
		node->next = L;
	}
	return RET_OK;
}


//从链表头节点出链表,头删法
int pop_list(LinkList L, char *udp_data) 
{
	//只有头节点或头节点为空
	if (NULL == L || L == L->next)
	{
		printf("pop list error, no data!, L:%d\n", L);
		usleep(500000);
		return RET_ERROR;
	}

	LinkList node;
	node = L->next;
	strncpy(udp_data, node->data, strlen(node->data));
	
	L->next = node->next;
	node->next->prior = L;
	free(node);
	node = NULL;

	return RET_OK;
}
//遍历链表
void traverse_list(LinkList L)
{
	if (NULL == L || L == L->next) return;

	LinkList node = NULL;
	for (node = L->next; L != node; node = node->next)
	{
		printf("node->data:%s\n", node->data);
	}
	//return RET_ERROR;
}

int main() 
{
	
	LinkList L = create_list();
	push_list(L, "hello1");
	push_list(L, "hello2");
	push_list(L, "hello3");

	traverse_list(L);

	char data[UDPLEN] = "";
	pop_list(L, data);
	printf("data:%s\n", data);

	pop_list(L, data);
	printf("data:%s\n", data);

	pop_list(L, data);
	printf("data:%s\n", data);

	pop_list(L, data);

	return 0;
}

 

参考:https://blog.csdn.net/ksaila/article/details/82227682

https://zhuanlan.zhihu.com/p/112286024

 

相关标签: C 数据结构