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
上一篇: 双向循环链表