双向链表(插入和删除)

在这里插入代码片#include <iostream>
using namespace std;
typedef int Elem;

typedef struct Node{
    Elem data;
    Elem index = -1;
    struct Node* pre;
    struct Node* next;
}node;

//初始化链表
node* initDoubleList()
{
    node* head = (node*)malloc(sizeof(node));
    if(head==NULL)
    {
        cout<<"开辟空间失败";
        return NULL;
    }
    node* temp = head;
    temp->next = NULL;
    temp->pre = NULL;
}

//向链表表尾添加数据
void addNewNode(node* head,int elem)
{
    node* temp =  head;
    while(temp->next!=NULL)
    {
        temp = temp->next;
    }
    node* newNode = (node*)malloc(sizeof(node));
    newNode->data = elem;
    newNode->next = NULL;
    newNode->pre = temp;//新节点的pre域,指向尾节点
    temp->next = newNode;//尾节点的next域,指向新节点
}

//根据下标插入
void addNewNodeByIndex(node* head,int pos,int elem)
{
    node* temp = head;
    //找到待插入节点位置
    for(int i=0;i<pos;i++)
    {
        temp = temp->next;
    }
    
    //创建新节点,为新节点赋值
    node* newNode = (node*)malloc(sizeof(node));
    newNode->data = elem;
    /*
        无论是Java实现还是C/C++实现,都需要理解下列步骤,顺序不能改变,可以作图理解
            S1:先让新节点的pre域指向,待插入结点的前一个节点 newNode->pre = temp
            S2:新节点的next域指向,待插入位置的下一个节点 newNode->next = temp->next
            S3:上一个节点的next域指向新节点,完成插入 temp->next = newNode
     */
    newNode->pre = temp;
    newNode->next = temp->next;
    temp->next = newNode;
}

//删除指定位置节点
void deleteNodeByIndex(node* head,int pos){
    node* temp = head;
    for(int i=0;i<pos;i++)
    {
        temp = temp->next;
    }
    node* delNode = temp->next;
    temp->next->pre = temp;
    temp->next = temp->next->next;
    free(delNode);
}

//删除给定值节点
void deleteNodeByValue(node* head,int value)
{
    node* temp = head;
    while(temp->next!=NULL)
    {
        temp = temp->next;
        if(temp->data==value)
            break;
    }

    node* delNode = temp;
    temp->next->pre = temp->pre;
    temp->pre->next = temp->next;
    free(delNode);
}

//打印链表
void showDoubleList(node* head)
{
    node* temp = head;
    while(temp->next!=NULL)
    {
        temp = temp->next;
        cout<<temp->data<<endl;
    }
}
int main()
{
    //初始化链表
    node* head =  initDoubleList();

    //向表尾插入节点
    addNewNode(head,5);
    addNewNode(head,4);
    showDoubleList(head);

    //指定位置插入
    cout<<"--------------"<<endl;
    addNewNodeByIndex(head,0,9);
    addNewNodeByIndex(head,2,15);
    showDoubleList(head);

    //删除指定位置节点
    cout<<"--------------"<<endl;
    deleteNodeByIndex(head,0);
    showDoubleList(head);

    //删除给定值
    cout<<"--------------"<<endl;
    deleteNodeByValue(head,15);
    showDoubleList(head);
}

在这里插入图片描述
由于多次插入的调用,所以文字会有重复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值