数据结构—双链表的有关操作(仅仅只有代码)

双链表的相关操作

上一篇博客浅谈了一下顺序表和单链表
这一篇博客简单介绍一下双链表的相关操作
所谓双向链表激素和相对于单链表增加了一个prior(前驱)指向该节点的直接前驱
经过这样处理后的链表会更加方便操作但是同时这也增加了空间复杂度

Tips:整个数据结构系列的博客是为了复习一下大二没学好的内容,因为是转专业到计算机所以大二才开始学计算机。没有C语言和离散数学基础直接就学了数据结构,所以感觉学的不好,于是寒假决定写博客复习下。内容可能比较浅,或者说没有深入探讨原理,仅简单给出代码。如果希望更好的学习可以不必阅读我的博客,以免耽误时间,这一系列博客是为了给自己复习,所谓为了省时间可能写的简洁,确实时间有限。而且·想把更多的时间放到后面的内容。前面的线性表,栈和队列等会快速过一下。代码有问题的话可以私信探讨。

#include <iostream>
using namespace std;


//双链表节点类型定义
typedef struct DLNode
{
    int data;//数据域
    struct DLNode *prior;//指向前驱
    struct DLNode *next;//指向后继
}DLNode,*DLinkList;



//创建双向链表
void CreatList_DL(DLinkList &L)
{
    L=new DLNode;
    L->prior=NULL;
    L->next=NULL;
    int x;
    cin>>x;
    DLNode *s;
    DLNode *r=L;//定义一个尾指针
    while(x!=0)
    {
        s=new DLNode;
        s->data=x;
        s->next=NULL;//后插
        r->next=s;
        s->prior=r;
        r=s;
        cin>>x;
    }

}

//双链表的插入
void ListInsert_DL(DLinkList &L,int index,int e)
{
    int count=0;//计数器记录位置
    DLNode *p;
    p=L;
    while(count<index-1)
    {
        p=p->next;
        count++;
    }
    DLNode *s=new DLNode;
    s->data=e;
    s->next=p->next;
    //考虑到一种特殊情况,如果是链表末尾的话,后面没有节点,则不用处理后面节点的prior域
    if(p->next!=NULL)
        p->next->prior=s;
    s->prior=p;
    p->next=s;
}


//双链表的删除
void ListDelete_DL(DLinkList &L, int i)
{
    int num=0;
    DLNode *temp;
    temp=L;
    while(num<i)//工作指针移动
    {
        temp=temp->next;
        num++;
    } 
    if(temp->next==NULL)//同样的特殊情况如果是最后一个节点,特殊处理
    {
        temp->prior->next=NULL;
    }
    else
    {
        temp->prior->next=temp->next;
        temp->next->prior=temp->prior;
    }
    delete temp;
}

//双链表的打印
void ListPrint_DL(DLinkList L)
{
    DLNode *p;
    p=L->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
}


int main()
{
    DLinkList L;
    CreatList_DL(L);
    ListPrint_DL(L);
    printf("\n");
    //随便选了一个例子测试
    int x;
    cin>>x;
    ListDelete_DL(L,x);
    ListPrint_DL(L);
    printf("\n");
    ListInsert_DL(L,x,x);
    ListPrint_DL(L);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值