文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用C++代码实现双向链表

2023-06-30 16:26

关注

这篇文章主要介绍“如何使用C++代码实现双向链表”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用C++代码实现双向链表”文章能帮助大家解决问题。

双向链表:两个指针域,一个指向前结点,一个指向后结点

list.h

#pragma once#define OK         1#define ERROR     0#define TRUE     1#define FALSE     0typedef int Status;typedef int ElemType;typedef struct DNode{    struct DNode *prior;        //前结点指针域    ElemType data;                //数据域    struct DNode *next;            //后结点指针域}DNode, *DLinkList;                //结点和指向结点的指针bool InitDLinkList(DLinkList &L);                        //双链表初始化Status CreatDLinkList(DLinkList &L);                    //尾插法创建链表,包含初始化功能bool InsertNextDNode(DNode *p, DNode *s);                //结点s插入在结点p之后Status DeleteNextDNode(DNode *p, ElemType &e);            //删除结点p的后继节点                void ListTraverse(const DLinkList L);                    //双链表的遍历Status ListInsert(DLinkList &L, int i, ElemType e);        //指定位置插入元素Status ListDelete(DLinkList &L, int i, ElemType &e);    //指定位置删除元素DNode* GetElem(DLinkList L, int i);                        //查找链表指定位置节点,返回的是结点void DestoryList(DLinkList &L);                            //销毁双链表,需要释放头结点

oper_func.cpp

#include <iostream>#include"list.h"bool InitDLinkList(DLinkList &L){    //构建空的双链表,作为双链表的头结点,数据域为空    L = new DNode;    if (L == NULL)                //内存分配失败        return FALSE;    L->prior = NULL;            //头结点的前驱指针始终指向NULL        L->next = NULL;                //暂时指向NULL    return TRUE;}Status CreatDLinkList(DLinkList &L){    //利用InsertNextDNode函数来创建    using std::cin;    using std::cout;    using std::endl;    if (InitDLinkList(L))    {        DNode *s,*r = L;                //s为新建的新结点,用来存储数据,而r为尾指针,始终指向尾部节点        int num;        cout << "输入你需要创建的双链表的个数:";        cin >> num;        for (int i = 1; i <= num; i++)        {            s = new DNode;                //创建的新结点            cout << "输入第" << i << "个元素:";            cin >> s->data;                //输入数据            s->next = NULL;            InsertNextDNode(r,s);        //结点s插在尾部节点之后            r = s;                        //尾指针指向新的尾结点        }        return OK;    }    else    {        cout << "内存不够,单链表创建失败!" << endl;        return ERROR;    }}//结点s插入在结点p之后bool InsertNextDNode(DNode *p, DNode *s){    if (p == NULL || s == NULL)        return FALSE;            //非法参数    s->next = p->next;    if (p->next != NULL)        //如果p不是最后一个结点    {        p->next->prior = s;    }    s->prior = p;    p->next = s;    return TRUE;}Status DeleteNextDNode(DNode *p, ElemType &e){    if(p == NULL)        return FALSE;            //非法参数    DNode *q = p->next;            //找到p节点的后继节点    if (q == NULL)                //节点p没有后继节点    {        return ERROR;    }    else    {        //有后继节点,但是p的后继节点为空        p->next = q->next;        e = q->data;        if (q->next != NULL)        {            q->next->prior = p;        }        delete q;        return OK;    }}void ListTraverse(const DLinkList L){    using std::cout;    using std::endl;    int i = 1;    DNode *p = L->next;                    //指向第一个元素    if (p == NULL)    {        cout << "双链表为空,无法输出元素!" << endl;        return;    }    while (p)    {        cout << "第" << i++ << "个元素为:" << p->data << endl;        p = p->next;    }}Status ListDelete(DLinkList &L, int i, ElemType &e){    if (i < 1)                 //位置不合理        return ERROR;    //寻找第i-1个结点    DNode *p = GetElem(L, i - 1);    //删除i-1结点的后面结点    return DeleteNextDNode(p,e);}DNode* GetElem(DLinkList L, int i){    DNode *p = L;    int j = 0;                //表示p指向的当前结点的位置,此时为头结点    while (p != NULL && j < i)    {        p = p->next;        //指向下一个结点        j++;    }    return p;}void DestoryList(DLinkList &L){    using std::cout;    using std::endl;    ElemType temp;    int i = 1;    while (L->next != NULL)    {        DeleteNextDNode(L,temp);        cout << "第" << i++ << "个删除的元素为:" << temp << endl;    }    cout << "双链表全部数据销毁成功!" << endl;    delete L;    cout << "头结点销毁,整个双链表销毁成功!" << endl;    L = NULL;                //头指针指向NULL}Status ListInsert(DLinkList &L, int i, ElemType e){    if (i < 1)        return FALSE;    //寻找第i-1个结点    DNode *p = GetElem(L, i - 1);    //直接在i-1结点的后面插入元素即可    DNode *s = new DNode;        //新建节点    s->data = e;    s->next = NULL;    s->prior = NULL;    return InsertNextDNode(p,s);}

main.cpp

#include <iostream>#include"list.h"void showMenu(){    using std::cout;    using std::cin;    using std::endl;    cout << "*********************************************************" << endl;    cout << "*** 1.指定位置插入元素            2.删除指定位置元素 ***" << endl;    cout << "*** 3.遍历单链表            0.销毁双链表并退出 ***" << endl;    cout << "*********************************************************" << endl;}int main(){    using std::cout;    using std::cin;    using std::endl;    int select = 0, flag = -1;            //输入的选择    DLinkList L;                //L表示头指针,始终指向表头    if (CreatDLinkList(L))        //尾插法创建单链表    {        cout << "双链表创建成功!" << endl;    }    else        cout << "双链表创建失败!" << endl;    while (true)    {        showMenu();        cout << "输入你的选择:";        cin >> select;        switch (select)        {        case 1: {        //指定位置插入元素            int position = 0, elem = 0;            cout << "输入插入的位置和元素:";            cin >> position >> elem;            if (ListInsert(L, position, elem))                cout << "指定位置插入元素成功!" << endl;            else                cout << "内存分配失败或者插入位置越界,插入失败!" << endl;        }                break;        case 2: {        //删除指定位置节点            int position = 0, elem = 0;            cout << "输入指定位置:";            cin >> position;            if (ListDelete(L, position, elem))            {                cout << "删除指定位置元素成功!元素为:" << elem << endl;            }            else            {                cout << "单链表为空或者删除位置不合理!" << endl;            }        }                break;        case 3: {            ListTraverse(L);        }                break;        case 0: {            DestoryList(L);            system("pause");            return 0;        }        break;        }    }    return 0;}

关于“如何使用C++代码实现双向链表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯