#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;
}