双链表 插入 删除 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;
}