#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct DNode {
int data;
struct DNode* prior, * next;
} DNode, * DLinkList;
bool InitDLinkList(DLinkList* L) {
*L = (DNode*)malloc(sizeof(DNode));
if (*L == NULL) {
return false;
}
(*L)->prior = NULL;
(*L)->next = NULL;
return true;
}
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL) {
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
void PrintDLinkList(DLinkList L) {
DNode* p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
bool DeleteNextDNode(DNode* p) {
if (p == NULL) {
return false;
}
DNode* q = p->next;
if (q == NULL) {
return false;
}
p->next = q->next;
if (q->next != NULL) {
q->next->prior = p;
}
free(q);
return true;
}
void DestoryList(DNode* L) {
while (L->next != NULL) {
DeleteNextDNode(L);
}
free(L);
L = NULL;
}
int main() {
DLinkList mylist;
if (!InitDLinkList(&mylist)) {
printf("初始化链表失败。\n");
return -1;
} else{
for ( int i = 0; i < 5; i++)
{
DNode* newNode = (DNode*)malloc(sizeof(DNode));
if (newNode == NULL) {
printf("内存分配失败\n");
DestoryList(mylist);
return -1;
}
newNode->data = i;
if (!InsertNextDNode(mylist, newNode)) {
printf("插入结点失败\n");
free(newNode);// 如果插入失败,释放新节点内存
DestoryList(mylist);
return -1;
}
}
// 打印链表
PrintDLinkList(mylist);
// 销毁链表
DestoryList(mylist);
}
}
这段代码实现了一个双向链表的数据结构,包括基本的初始化、插入、打印、删除和销毁功能。
主要功能如下:
InitDLinkList
: 初始化双向链表的头节点。InsertNextDNode
: 在链表的指定节点后插入一个新节点。PrintDLinkList
: 打印链表中所有节点的数据。DeleteNextDNode
: 删除指定节点的下一个节点。DestoryList
: 销毁整个链表,释放所有节点的内存。
在main
函数中,首先初始化一个链表,然后循环5次,每次在链表头节点后插入一个新节点,节点数据为从0到4的整数。插入成功后,打印整个链表。最后,销毁链表。
代码还包含了一些错误处理,如内存分配失败或插入节点失败时,会打印提示信息,并释放已分配的内存。