#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;
}
运行结果
: