双链表 插入 删除 C/C++

#include<iostream>
using namespace std;

typedef struct Link_Node{
int data;
Link_Node *next;
Link_Node *pre;
};

// 在第K个元素后面插入新的值。
int insert_data(Link_Node *bi_link_list,int k,int value)
{

if(k<0) return -1; // 输入的k不合法
Link_Node *p = bi_link_list;
int i =0;
while(p&&i<k){
p=p->next;
i++;
}
if(!p) return -1; // 没有找到k的时候,p已经到末尾了

Link_Node *p_new = (Link_Node*)malloc(sizeof(Link_Node));

p_new->data = value;

// 后缀的接续 不能变
p_new->next = p->next;
p->next = p_new;

// 前缀的接续,没关系
p_new->pre = p;
if(p_new->next) p_new->next->pre = p_new; // 判断是否是最后一个元素,最好不要使用多级指针,在链表末尾的和开始的时候容易出空指针问题,

return 0;

}

int delete_data(Link_Node *bi_link_list,int k)
{

if(k<=0) return -1; // 输入的k不合法。
Link_Node *p = bi_link_list;
int i = 0;
// 找到要删除的元素的上一个元素
while(p&&i<k-1){
p = p->next;
i++;
}
// 要删除的元素为 p->next
if(!p||!p->next) return -1;

Link_Node *p_del = p->next;

p->next = p_del->next;
if(p_del->next) p_del->next->pre = p; // 最后一个元素不会执行这一句话
free(p_del);
return 0;

}
int main()
{
Link_Node *bi_link_list = (Link_Node*)malloc(sizeof(Link_Node));

Link_Node *current = bi_link_list; // 保存上一个节点
for(int i = 0;i < 10;i++){
Link_Node *p_node = (Link_Node*)malloc(sizeof(Link_Node));

p_node->data = i;
p_node->next = NULL;
p_node->pre = current;

current->next = p_node;
current = p_node;
}

current = bi_link_list;
while(current=current->next) cout<<"当前节点值:"<<current->data<<"下一个节点值:"<<((current->next) ? to_string(current->next->data):"目前已是尾节点")<<endl;

insert_data(bi_link_list,10,90);

current = bi_link_list;
while(current=current->next) cout<<"当前节点值:"<<current->data<<"下一个节点值:"<<((current->next) ? to_string(current->next->data):"目前已是尾节点")<<endl;

delete_data(bi_link_list,12);
current = bi_link_list;
while(current=current->next) cout<<"当前节点值:"<<current->data<<"下一个节点值:"<<((current->next) ? to_string(current->next->data):"目前已是尾节点")<<endl;

}

 

posted @ 2022-05-18 17:39  danieldai  阅读(70)  评论(0编辑  收藏  举报