IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 关于单链表C++(第一次学链表新手可参考) -> 正文阅读

[数据结构与算法]关于单链表C++(第一次学链表新手可参考)

就是一群指针按顺序指来指去,在大佬的图绘指点下,实现了链表基本路径
代码串巨长,要耐心嗷
总结一下就是链表的所有活动都需要通过指针进行完成
请添加图片描述
请添加图片描述
请添加图片描述

#include <iostream>
using namespace std;
struct Node{
    int value;
    Node* next;
    Node(int num):value(num),next(Null){};//许久不见的c++初始化神奇写法,结构体函数
    Node(){};
};
class LinkList{//不是吧不是吧链表要写这么多吗
public://这个也是C++专属写法
    void create();//初始化
    void insertHead(Node*);//头插法
    void insertTail(Node*);//尾插法
    Node* findByIndex(int);//根据索引查找节点并返回节点指针,注意0返回头节点
    Node* findByValue(int);//根据值查找节点并返回节点指针,这个也是0返回头节点
    int getLength();//获取链表长度
    void delleteByIndex(int);//根据索引删除节点
    void deleteByValueOnce(int);//根据节点值删除第一个节点
    void deleteByValueAll(int);//根据节点值删除所有节点
    void editByIndex(int,int);//根据索引修改节点的值
    void print();
private:
    Node* head;//头节点指针,value用于存放链表长度
};
void LinkList::create(){//初始化
    head=new Node();
    head->next=NULL;
    head->value=0;
}
void LinkList::insertHead(Node* p){//头插法
    p->next=head->next;//如图所示啦
    head->next=p;//head->p->next
    head->value++;//整个链变长,所以总长也要增长
}
void LinkList::insertTail(Node* p){//尾插法
    Node* tail=findByIndex(head->value);//head的数据域指的是链表长度,所以找到的是尾巴然后将最后一个值给tail
    if(tail==NULL)//尾巴为空相当于你在最后空的后面插一个值,就跟头插法一样,头前面也是空
        insertHead(p);//头插法
    else{
        p->next=tail->next;//p指向tail的下一个
        tail->next=p;//tail下一个变成p,完成后接
    }
    head->value++;//总长增加
}
Node* LinkList::findByIndex(int index){//根据索引查找节点并返回节点指针,注意0返回头节点
    Node* p=head;//p里存了head,也就是头指针
    int i=0;
    if(index<0||index>getLength()){
        cout<<"索引非法"<<endl;//索引不在范围内
        return NULL;
    }
    while(p){//p数值不为0,头指针数值不为0链表还够长
        if(i==index)//找到索引了
            return p;//返回该索引的地址,指针
        else{
            p=p->next;//没找到往下走
            i++;
        }
    }
    return NULL;
}
Node* LinkList::findByValue(int value){//根据值查找节点并返回节点指针,这个也是0返回头节点
    Node* p=head->next;//设置一个指针p接管头指针的下一个指针
    for(;p;p=p->next){//这个表达第一次见循环每个p都变成下一个p,循环到链表没了就结束了
        if(p->value==value)//找到对应值的指针了
            return p;//返回这个指针
    }
    return NULL;//不然就返回没有
}
int LinkList::getLength(){
    return head->value;//头指针数据域里就是链表长度
}
void LinkList::delleteByIndex(int index){//根据索引删除节点
    if(index==0){//头节点那么可爱怎么可以删删它
        cout<<"不能删除头节点"<<endl;
        return;
    }
    Node* p=findByIndex(index);//先找到对应这个索引的指针
    if(!p){//如果p=0也就是没找到
        cout<<"删除失败"<<endl;
    }
    else{
        Node* q=findByIndex(index-1);//寻找目标的前一位同学
        q->next=p->next;//直接把前一位同学引导到后一位同学,伟大的牺牲了自己
        head->value--;//总长度减少
        delete p;//p都没了,就把空间回收啦
    }
}
void LinkList::deleteByValueOnce(int value){根据节点值删除第一个节点
    Node* p=head->next;//又让p接管头指针的下一个了
    Node* q=head;//好家伙q直接代替头指针了,现在q相当于p的前一位
    bool flag=false;
    for(;p;p=p->next,q=q->next){//p,q每轮回一次,变成下一个
        if(p->value==value){//如果p数据域与查找的相同
            q->next=p->next;//q直接越过p链接p的下一个
            delete p;//回收空间
            flag=true;//表示找到了
            head->value--;//总长减少
            break;
        }
    }
    if(!flag){//没找到
        cout<<"链表中不存在值为:"<<value<<"的节点"<<endl;
    }
}
void LinkList::deleteByValueAll(int value) {//所有数据域与这个值相同的都删掉
    Node* p = head->next;
    Node* q = head;
    bool flag = false;
    while(p){//前面以及覆盖方式都是一样的,就是要轮回到链表结束
        if (p->value == value) {
            q->next = p->next;
            Node* temp = p;//不能直接删p,不然没法轮回
            p = p->next; //因为中间p已经不见了,q不动装作一切都没有发生的亚子
            delete temp;//清理出空间
            head->value--;//总长减少
            flag = true;//找到了
        }
        else {
            p = p->next;//暂时没找到就继续轮回
            q = q->next;
        }
    }
    if (!flag) {//彻底没找到
        cout<<"链表中不存在值为:"<<value<<"的节点"<<endl;
    }
}
void LinkList::editByIndex(int index,int value) {//根据索引修改节点的值
    if (index == 0) {//咋地又想对小可爱下手嘛,必不可能
        cout<<"不能修改头节点!"<<endl;
        return;
    }
    Node* p = findByIndex(index);//找到对应索引的指针
    if (!p) {//如果没找到
        cout<<"修改失败!"<<endl;
        return;
    }
    else {//如果找到了进行修改,重新赋值
        p->value = value;
    }
}
void LinkList::print() {//打印值
    for (Node* p = head->next;p;p = p->next) {
        cout<<p->value<<" ";
    }
    cout<<endl;
}

原文链接:https://blog.csdn.net/dawn_after_dark/article/details/73610674

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-05 17:36:08  更:2021-08-05 17:39:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:58:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码