#include <stdio.h>
#include <stdlib.h>
typedef struct DlinkNode {
int data;
struct DlinkNode* prev;
struct DlinkNode* next;
} DlinkNode, *DlinkList;
// 创建带头结点的双向链表
DlinkList createDlinkList() {
DlinkNode* head = (DlinkNode*)malloc(sizeof(DlinkNode));
head->prev = NULL;
head->next = NULL;
return head;
}
// 在双向链表末尾插入元素
void dlinkListInsert(DlinkList list, int data) {
DlinkNode* newNode = (DlinkNode*)malloc(sizeof(DlinkNode));
newNode->data = data;
newNode->next = NULL;
newNode->prev = NULL;
DlinkNode* p = list;
while (p->next != NULL) {
p = p->next;
}
newNode->prev = p;
p->next = newNode;
}
// 在双向链表指定位置插入元素
void dlinkListInsertAt(DlinkList list, int index, int data) {
DlinkNode* newNode = (DlinkNode*)malloc(sizeof(DlinkNode));
newNode->data = data;
newNode->next = NULL;
newNode->prev = NULL;
DlinkNode* p = list;
int count = 0;
while (p->next != NULL && count < index) {
p = p->next;
count++;
}
newNode->next = p->next;
newNode->prev = p;
if (p->next != NULL) {
p->next->prev = newNode;
}
p->next = newNode;
}
// 从双向链表中删除指定位置的节点
void dlinkListDeleteAt(DlinkList list, int index) {
DlinkNode* p = list;
int count = 0;
while (p->next != NULL && count < index) {
p = p->next;
count++;
}
if (p->next != NULL) {
DlinkNode* q = p->next;
p->next = q->next;
if (q->next != NULL) {
q->next->prev = p;
}
free(q);
}
}
// 修改双向链表指定位置的节点值
void dlinkListUpdate(DlinkList list, int index, int newData) {
DlinkNode* p = list;
int count = 0;
while (p->next != NULL && count < index) {
p = p->next;
count++;
}
if (p->next != NULL) {
p->next->data = newData;
}
}
// 在双向链表中查找指定位置的节点值
int dlinkListGet(DlinkList list, int index) {
DlinkNode* p = list->next;
int count = 0;
while (p != NULL && count < index) {
p = p->next;
count++;
}
if (p != NULL) {
return p->data;
}
return -1;
}
// 遍历双向链表并输出节点值
void dlinkListVisit(DlinkList list) {
DlinkNode* p = list->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 销毁双向链表,释放内存
void destroyDlinkList(DlinkList list) {
DlinkNode* p = list;
while (p != NULL) {
DlinkNode* temp = p;
p = p->next;
free(temp);
}
}
int main() {
DlinkList list = createDlinkList();
// 在双向链表末尾插入元素
dlinkListInsert(list, 10);
dlinkListInsert(list, 20);
dlinkListInsert(list, 30);
dlinkListInsert(list, 40);
// 输出双向链表内容
printf("双向链表内容:");
dlinkListVisit(list);
// 在双向链表指定位置插入元素
dlinkListInsertAt(list, 2, 25);
// 输出双向链表内容
printf("插入元素后的双向链表内容:");
dlinkListVisit(list);
// 删除双向链表指定位置的节点
dlinkListDeleteAt(list, 1);
// 输出双向链表内容
printf("删除元素后的双向链表内容:");
dlinkListVisit(list);
// 修改双向链表指定位置的节点值
dlinkListUpdate(list, 2, 35);
// 输出双向链表内容
printf("修改元素后的双向链表内容:");
dlinkListVisit(list);
// 查找双向链表指定位置的节点值
int data = dlinkListGet(list, 1);
printf("索引1的节点值:%d\n", data);
destroyDlinkList(list);
return 0;
}
双链表的增删改查以及测试操作
最新推荐文章于 2024-09-14 14:11:43 发布