首页 > 编程语言 >双向链表C++

双向链表C++

时间:2024-03-30 11:04:55浏览次数:20  
标签:head Ip Name ip C++ next 链表 双向 prev

今天写了双向链表..........写的头好晕..........看来链表还是要多加练习

这个双向链表完成了增删改查,并且最后销毁链表

环境VScode

#include <iostream>
#include <cstring>
using namespace std;
// 结点类
class Node
{
public:
    string ip;   // 客户端ip
    string name; // 客户端名字
    Node *next;  // 指向下一个结点
    Node *prev;  // 指向上一个结点
    // int len;
    Node()
    {
        // 当前对象不用加前缀
        next = nullptr;
        prev = nullptr;
    }
    void display()
    {
        cout << "Ip = " << ip << " "
             << "Name = " << name << endl;
    }
};
class MYList
{
public:
    // 头结点
    int len;
    Node *head;
    MYList();
    ~MYList();
    // 增加一个结点
    void addMYList(string, string);
    // 删除一个结点
    void deleteMYList(string);
    // 修改一个结点
    void modifyMYList(string, string);
    // 遍历链表
    void traverse();
    // 销毁链表
    // void destroyList(head);
};
MYList::MYList()
{
    // 新建一个头结点
    head = new Node();
    // Node = new Node;堆空间都一样
    //  Node n;栈空间正确写法 ;Node n ();栈空间这样写错误,意思不一样
    len = 0;
}
MYList::~MYList()
{
    Node *p = head->next;
    while (p)
    {
        Node *temp = p;
        p = p->next;
        delete temp;
    }
    head->next = nullptr;
    delete head;
    cout<<"List is successfully destroyed!"<<endl;
}
// 增加一个结点
void MYList::addMYList(string ip, string name)
{
    // 创建数据结点
    Node *pNew = new Node();
    if (pNew == nullptr)
        return;
    pNew->ip = ip;
    pNew->name = name;
    // 头插
    // 数据结点插在头结点后面(数据结点从无到有)
    if (head->next == nullptr)
    {
        pNew->next = head->next;
        pNew->prev = head;
        head->next = pNew;
        // 记录结点个数
        len++;
    }
    // 从少到多
    else
    {
        pNew->next = head->next;
        pNew->prev = head;
        head->next->prev = pNew;
        head->next = pNew;
        len++;
    }
}
// 根据客户端ip删除
void MYList::deleteMYList(string ip)
{
    // p指向第一个数据结点
    Node *p = head->next;
    // Node* q = head->next;
    // 遍历
    while (p)
    {
        if (p->ip == ip)
        {
            // 只有一个数据结点
            if (p->next == nullptr)
            {
                p->prev->next = NULL;
                p->prev = NULL;
            }
            // 多个
            else
            {
                p->prev->next = p->next;
                p->next->prev = p->prev;
                p->next = nullptr;
                p->prev = nullptr;
            }
            delete p;
            len--;
            // ip唯一
            break;
            // ip不唯一,需要伴随指针q
            // p = q->next
        }
        else
            p = p->next;
        // q = q->next;
    }
}
// 根据ip修改名字
// 修改节点
void MYList::modifyMYList(string ip, string name)
{
    // p指向第一个数据结点
    Node *p = head->next;
    // 遍历链表
    while (p)
    {
        if (p->ip == ip)
        {
            p->name = name; // 修改节点名称
            break;          // 找到对应IP后立即结束循环
        }
        p = p->next;
    }
}
// 遍历打印函数
void MYList::traverse()
{
    Node *p = head->next;
    if (p == nullptr)
        return;
    // 遍历
    while (p)
    {
        // 结点类打印方法
        p->display();
        p = p->next;
    }
}


int main()
{
    MYList h;
    h.addMYList("2020", "新能源汽车");
    h.addMYList("2050", "移民火星");
    h.addMYList("2040", "脑机接口");
    h.addMYList("0000", "马斯克");
    h.traverse();
    cout << "Len = " << h.len << endl;
    cout << "-------------------------------------" << endl;

    h.deleteMYList("0000");
    h.traverse();
    cout << "Len = " << h.len << endl;
    cout << "-------------------------------------" << endl;

    h.deleteMYList("2020");
    h.traverse();
    cout << "Len = " << h.len << endl;
    cout << "-------------------------------------" << endl;

    h.modifyMYList("2050", "飞向太阳");
    h.traverse();
    cout << "Len = " << h.len << endl;
    cout << "-------------------------------------" << endl;

    h.deleteMYList("2050");
    //h.deleteMYList("2040");
    h.traverse();
    cout << "Len = " << h.len << endl;
    cout << "-------------------------------------" << endl;

    return 0;
}

运行结果:

PS E:\VScode_code>  & 'c:\Users\hp\.vscode\extensions\ms-vscode.cpptools-1.19.9-win32-x64\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-4vymqctd.lfw' '--stdout=Microsoft-MIEngine-Out-sobjeroq.ve0' '--stderr=Microsoft-MIEngine-Error-5quf05eq.2vm' '--pid=Microsoft-MIEngine-Pid-ey0ko5sd.5sb' '--dbgExe=C:\Program Files (x86)\mingw64\bin\gdb.exe' '--interpreter=mi' 
Ip = 0000 Name = 马斯克
Ip = 2040 Name = 脑机接口
Ip = 2050 Name = 移民火星
Ip = 2020 Name = 新能源汽车
Len = 4
-------------------------------------
Ip = 2040 Name = 脑机接口
Ip = 2050 Name = 移民火星
Ip = 2020 Name = 新能源汽车
Len = 3
-------------------------------------
Ip = 2040 Name = 脑机接口
Ip = 2050 Name = 移民火星
Len = 2
-------------------------------------
Ip = 2040 Name = 脑机接口
Ip = 2050 Name = 飞向太阳
Len = 2
-------------------------------------
Ip = 2040 Name = 脑机接口
Len = 1
-------------------------------------
List is successfully destroyed!

标签:head,Ip,Name,ip,C++,next,链表,双向,prev
From: https://blog.csdn.net/yangguanghhh/article/details/137168100

相关文章

  • leetcode-面试经典150题-42-接雨水(双指针c++)
    第一遍做的时候(没有看题解)我想到的思路就是遍历每一个凹下去的部分,计算能接到的雨水数量,然后累加,left,right分别是凹点的左右边界下面是代码:classSolution{public:inttrap(vector<int>&height){intn=height.size();intans=0;for(int......
  • C++堆详细讲解
    介绍二叉堆是一种基础数据结构,主要应用于求出一组数据中的最大最小值。C++的STL中的优先队列就是使用二叉堆。堆的性质: 1.堆是一颗完全二叉树;2.堆分为大根堆和小根堆(这里不讨论那些更高级的如:二叉堆,二叉堆,左偏树等等)3.大根堆满足每个节点的键值都小于等......
  • C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现
    在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。网络层专注于处理网络通信与读写事件业务层专注于处理读写事件到来时所需求的各项业务数据层专注于与底层数据库间进行增删改查。数据库中有User、Fr......
  • 大海捞针 Skia(C++) 第 4.1 期(特别篇):将绘制结果输出到窗口
    前言由于本人(我)没有系统学习过图形学,无法提供准确的术语表达,如果哪位大佬看到我的一些错误,还请友善指出!第四期之后,我一直纠结于应该讲些什么。图形学的东西我真的学的不多,未来也不是很想走这个方向。但是我仍然希望通过我的一些绵薄之力为一些苦苦寻找关于Skia资料的兄弟们提供......
  • 华为OD机试 - 传递悄悄话(Java & JS & Python & C & C++)
    须知哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持文章目录须知题目描述输入描述输出描述解题思路:题目描述给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在......
  • 华为OD机试 - 剩余银饰的重量(Java & JS & Python & C & C++)
    须知哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持文章目录须知题目描述输入描述输出描述解题思路:题目描述有N块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。每一回合,从中选......
  • 2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有......
  • 2024年03月CCF-GESP编程能力等级认证C++编程七级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题下列关于排序的说法,正确的是()。A.冒泡排序是最快的排序算法之一。B.快速排序通常是不稳定的。C.最差情况,N个元素做归并排序......
  • ccfcsp-2019-12-2回收站选址(c++满分题解)
    该题就是考察点的保存以及索引的保存和遍历,看了他的用例说明,我原先以为暴力只能得50分,但是又没有想到别的优化方法,就写了一下暴力,发现居然AC下面是代码:#include<iostream>#include<vector>#include<map>usingnamespacestd;intmain(){ intn; cin>>n; vector<pair<......
  • UE4 C++ Widget的NativeConstruct 与 NativePreConstruct
    构造函数由于Widget是由UE的反射系统创建的,其生命周期由UE引擎管理,所以并不存在构造函数,UE为Widget类定义了两个虚函数NativeConstruct与NativePreConstruct来充当构造函数的作用。而这两个函数的调用都必须在Widget被实例化之后才能进行调用如何在Widget中获取角色在蓝图节......