双向链表中间插入节点,删除节点
#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef int data_t;
typedef struct node
{data_t data;struct node* prev;struct node* next;
}node_t;
int dlist_create(node_t** head, data_t data);//函数声明创建链表
void dlist_showall(node_t* head);//函数声明遍历链表
int dlist_addhead(node_t** head, data_t data);//函数声明头插链表
int dlist_addtail(node_t** head, data_t data);//函数声明尾插链表
int dlist_insert(node_t** head, data_t,data_t );// 函数声明中间插链表
node_t* dlist_query(node_t** head, data_t data);//函数声明数据查询
int dlist_update(node_t** head, data_t old,data_t new_data);//函数声明链表更新
void dlist_destory(node_t* head);//函数声明销毁链表
int dlist_delete(node_t** head, data_t data);//函数声明删除节点int dlist_create(node_t** head, data_t data)
{ node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = data;pnew->prev = pnew->next = NULL;*head = pnew;return 0;
}
int dlist_addhead(node_t** head, data_t data)
{node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = data;pnew->prev = pnew->next = NULL;pnew->next = *head;if (*head){(*head)->prev = pnew;}*head = pnew;return 0;
}
int dlist_addtail(node_t** head, data_t data)
{node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = data;pnew->prev = pnew->next = NULL;if (*head == NULL)//空链表,创建{*head = pnew;return 0;}node_t* p = *head;while (p->next){ p = p->next;}p->next = pnew;pnew->prev = p;return 0;}int dlist_insert(node_t** head, data_t pos, data_t new_data)
{// 创建新节点node_t* pnew = (node_t*)malloc(sizeof(node_t));if (pnew == NULL)return -1;pnew->data = new_data;// 空链表处理if (*head == NULL){pnew->prev = NULL;pnew->next = NULL;*head = pnew;return 0;}node_t* p = *head;// 如果要插入的位置是头节点if (p->data == pos){pnew->prev = NULL;pnew->next = p;p->prev = pnew;*head = pnew;return 0;}// 查找插入位置while (p != NULL){if (p->data == pos){// 在找到的节点前插入新节点pnew->next = p;pnew->prev = p->prev;p->prev->next = pnew;p->prev = pnew;return 0;}p = p->next;}// 如果没找到指定位置,则插入到尾部p = *head;while (p->next != NULL){p = p->next;}p->next = pnew;pnew->prev = p;pnew->next = NULL;return 0;
}node_t* dlist_query(node_t* head, data_t data)
{node_t* p = head;while (p){if (p->data == data) // 直接比较数据return p; // 返回找到的节点指针p = p->next;}return NULL;
}int dlist_update(node_t** head, data_t old, data_t new_data)
{node_t* p = dlist_query(*head, old);if (p == NULL)return 0;p->data = new_data;return 0;
}int dlist_delete(node_t** head, data_t data)
{if (*head == NULL) return -1; // 空链表检查node_t* p = *head;while (p){if (p->data == data){// 处理头节点情况if (p->prev == NULL){*head = p->next;if (p->next)p->next->prev = NULL;}else{p->prev->next = p->next;if (p->next) // 检查是否是尾节点p->next->prev = p->prev;}free(p);return 0;}p = p->next;}return -1;
}void dlist_destory(node_t** head)
{node_t* p = *head;if (p == NULL)return;while (p->next){p = p->next;free(p->prev);}free(p);*head = NULL;}void dlist_showall(node_t* head)
{node_t* p = head;while (p){printf("%3d", p->data);p = p->next;}printf("\n");
}int main()
{node_t* head = NULL;dlist_create(&head, 1024);for ( int i = 0; i < 6; i++)dlist_addtail(&head,i+1);dlist_showall(head);while (1){printf("\n请输入要插入处节点数据(-1退出):");data_t pos;scanf_s("%d", &pos);if (pos == -1)break;printf("请输入要插入的新数据:");data_t new_data;scanf_s("%d", &new_data);if (dlist_insert(&head, pos, new_data) == 0){printf("插入后的链表内容:\n");dlist_showall(head);}else{printf("插入失败!\n");}}while (1){printf("\n请输入要删除的节点数据(-1退出):");data_t del_data; // 正确声明变量scanf_s("%d", &del_data);if (del_data == -1)break;if (dlist_delete(&head, del_data) == 0){printf("删除后的链表内容:\n");dlist_showall(head);}else{printf("删除失败!\n"); // 修正错误提示}}dlist_destory(&head);return 0;
}
运行结果
: