#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode {
int data;
struct LinkNode* pre;
struct LinkNode* next;
} LinkNode;
typedef struct dlinklist {
LinkNode head;
} DLinkList;
DLinkList* Init_list() {
DLinkList* list = (DLinkList*)malloc(sizeof(DLinkList));
list->head.next = &(list->head);
list->head.pre = &(list->head);
list->head.data = -1;
return list;
}
void insert_list(DLinkList* list, LinkNode* data) {
LinkNode* tmp = list->head.pre; // 获取最后一个结点
tmp->next = data;
data->pre = tmp;
data->next = &(list->head); // 将新结点的 next 指向头结点
list->head.pre = data; // 更新头结点的前驱指针
}
void print_list(DLinkList* list) {
LinkNode* tmp = list->head.next;
while (tmp != &(list->head)) {
printf("data = %d\n", tmp->data);
tmp = tmp->next; // 更新指向下一个结点
}
}
void insert_by_pos(DLinkList* list, int pos, LinkNode* data) {
if (pos <= 0) {
printf("Invalid position!\n");
return;
}
LinkNode* tmp = &(list->head);
for (int i = 0; i < pos-1; i++) {
tmp = tmp->next;
if (tmp == &(list->head)) {
printf("Invalid position!\n");
return;
}
}
data->pre = tmp; // 前驱
data->next = tmp->next;
tmp->next->pre = data; // 更新原来位置的下一个结点的前驱指针
tmp->next = data; // 更新前一个结点的后继指针
}
void delete_list(DLinkList* list,int pos) {
if (pos <= 0) {
printf("Invalid position!\n");
return;
}
LinkNode* tmp = &(list->head);
for (int i = 0; i < pos - 1; i++) {
tmp = tmp->next;
if (tmp == &(list->head)) {
printf("Invalid position!\n");
return;
}
}
LinkNode* node_to_delete = tmp->next;
tmp->next = node_to_delete->next; // 更新前一个节点的后继指针
node_to_delete->next->pre = tmp; // 更新下一个节点的前驱指针
free(node_to_delete); // 释放删除的节点内存
}
int main() {
DLinkList* list = Init_list();
LinkNode* s1 = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* s2 = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* s3 = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* s4 = (LinkNode*)malloc(sizeof(LinkNode));
s1->data = 1;
s2->data = 2;
s3->data = 3;
s4->data = 10;
insert_list(list, s1);
insert_list(list, s2);
insert_list(list, s3);
print_list(list);
printf("============================\n");
insert_by_pos(list,2,s4);
print_list(list);
delete_list(list,4);
printf("============================\n");
print_list(list);
// 释放内存
free(s1);
free(s2);
free(s3);
free(list);
return 0;
}
C语言实现双向循环链表
最新推荐文章于 2025-12-05 13:31:09 发布
该代码实现了一个双向链表的初始化、在指定位置插入节点以及删除指定位置节点的功能。首先定义了双向链表的结构体,然后提供了初始化函数Init_list,插入函数insert_list、insert_by_pos和delete_list。在main函数中,创建并操作链表,展示了这些功能的使用。
563

被折叠的 条评论
为什么被折叠?



