首页 > 编程语言 >C++链表的创建与基本操作

C++链表的创建与基本操作

时间:2024-12-09 22:57:15浏览次数:14  
标签:Node current head nullptr C++ next 链表 基本操作

在C++中,链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有灵活的内存管理和高校的插入与删除操作,但访问效率较低。链表的每个节点通常包含两部分:1、数据部分(存储链表中元素的数据);2、指针部分(指向链表中的下一个节点)。

链表类型主要有:1、单链表(每个节点只有一个指向下一个节点的指针);2、双向链表(每个节点包含指向下一个节点和前一个节点的指针);3、循环链表(最后一个节点指向链表的头节点)。

下面直接结合代码说明链表的创建和基本操作:

#include<iostream>
using namespace std;
struct Node{
    int value;
    Node* next;
    //***构造函数的定义,Node(传入数据): 结构体变量(赋值数据),结构体变量(赋值数据){}。
    Node(int Data): value(Data), next(nullptr){} 
};
class LinkedList{
    private:
        //***后续不能再出现Node* head(已定义过),会因重复定义导致原有的head被覆盖产生bug
        Node* head;
    public:
        LinkedList(): head(nullptr){}
        ~LinkedList(){
            if(head!=nullptr){
                while(head->next != nullptr){
                    Node* temp = head->next;
                    head->next = temp->next;
                    //删除temp指针及为清空temp指针所指向的Node节点的所有数据(数据部分和指针地址)
                    delete temp;
                }
            }
        }
        //插入元素到链表头部
        void input_left(int data){
            Node* newnode = new Node(data);
            if(head == nullptr){
                head = newnode;
                return;
            }
            Node* current = head;
            head = newnode;
            head->next = current;
            //head->next = head(无意义,head = head->next有意义), 错误代码:不能把自己的地址赋值给自己指向的地址,在head = newnode时将原有地址进行了覆盖
        }
        //插入元素到链表尾部
        void input_right(int data){
            Node* newnode = new Node(data);
            if(head == nullptr){
                head = newnode;
                return;
            }
            if(head->next == nullptr){
                head->next = newnode;
                return;
            }
            Node* current = head->next;
            while(current->next != nullptr){
                //由于current在上面已经定义并初始化Node* current = head->next,因此下面再使用current时直接调用赋值即可,不需要再重新Node* current定义申明了
                current = current->next;
            }
            current->next = newnode;
        }
        //打印链表中的每个元素
        void print_list(){
            Node* current = head;
            if(current==nullptr){
                cout<<"链表为空"<<endl;
                return;
            }
            if(current->next == nullptr){
                cout<<current->value<<"->"<<"nullptr";
            }
            while(current->next != nullptr){
                cout<<current->value<<"->";
                current = current->next;
            }
            cout<<current->value<<"->nullptr"<<endl;
        }
        //删除链表中的某个元素
        void delete_list(int data){
            Node* current = head;
            if(current==nullptr){
                cout<<"链表为空"<<endl;
                return;
            }
            if(current->value==data){
                head = head->next;
                delete current;
                return;
            }
            //***分清current->next !=nullptr && current->next->value != data先后顺序
            //如果current->next已经为nullptr空时,再引用current->next->valu会报错!!!
            while(current->next !=nullptr && current->next->value != data){
                current = current->next;
            }
            if(current->next==nullptr){
                cout<<"链表中并没有此元素"<<endl;
                return;
            }
            if(current->next->value == data){
                Node* deletenode = current->next;
                current->next = deletenode->next;
                delete deletenode;
                return;
            }
        }
};
int main(){
    //ListNode* node = new ListNode();  // 带有new标记,确保分配内存,仅定义时不分配内存
    LinkedList list1;
    list1.input_right(4);
    list1.input_right(3);
    list1.input_right(1);
    list1.input_right(6);
    list1.input_right(0);
    list1.input_right(7);
    list1.input_left(10);
    list1.input_right(15);
    list1.input_right(6);
    list1.print_list();
    list1.delete_list(16);
    list1.print_list();
    cout<<"学好C++,走遍天下都不怕!"<<endl;
}

上面展示了链表创建(构造和析构函数)、链表的插入(从头部和尾部插入)、链表的删除(指定元素的删除)。标记***的为笔者在编写的时候出现的一些需要特殊注意的问题,总结如下:

1、在构造函数中,有一种简便的书写方式格式如:Node(int 传入参数): value(传入参数), next(nullptr){},其中value(输入参数),value表示结构体中存在的变量,(输入参数)表示外部传入或指定常量。

2、在if、while进行循环判断语句时,if( current->next != nullptr && current->next->value != data),尤其是and(&&)时,是有先后顺序的,当current->next不为空时(空,即为current->next未分配地址内存),current->next->value才有意义,即C++总是只能访问被分配地址内存的数据。

3、ListNode* node = new ListNode();带有new标记时,才确保定义的ListNode类型,命名为node的指针对象被分配了内存。如果仅为ListNode* node;未被new标记,则仅为定义声明的情况下,命名为node的指针对象未被计算机分配内存(内存即为地址,通过指针可以查找)。

以上为笔者在创建链表和基本操作时遇到的一些注意问题,如有问题可以随时私信与我交流!

标签:Node,current,head,nullptr,C++,next,链表,基本操作
From: https://blog.csdn.net/qq_43287713/article/details/144352803

相关文章

  • C++ 1070 结绳 (乙级)
    给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。给定N段绳子的长度,你需要找出它们能串成的绳子的最大长......
  • C++ 1072 开学寄语 (乙级)
    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也!本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器......
  • C++ 1093 字符串A+B (乙级)
    给定两个字符串A和B,本题要求你输出A+B,即两个字符串的并集。要求先输出A,再输出B,但重复的字符必须被剔除。输入格式:输入在两行中分别给出A和B,均为长度不超过106的、由可见ASCII字符(即码值为32~126)和空格组成的、由回车标识结束的非空字符串。输出格式:在一行中......
  • CCF GESP C++ 二级上机题(十六道题及其思路详解合集)
    #include<iostream>usingnamespacestd;intmain(){//定义一个整型变量n,用于接收输入的数值,该数值将决定后续循环的次数等操作intn;cin>>n;//定义两个循环变量i和j,分别用于外层循环和内层循环的计数inti,j;//定义字符变量s并初始化......
  • C++的抽象类
    抽象类概念在C++中,抽象类是一个无法实例化的类,通常用于定义接口或基类。抽象类的主要特征是至少包含一个纯虚函数(purevirtualfunction),这种函数在基类中没有实现,必须由派生类提供具体的实现。抽象类的主要作用是提供一个共享的接口,使得不同的派生类可以实现这些接口,从而实......
  • 链表中倒数第K个节点 剑指offer
    题目描述       输入一个链表,输出该链表中倒数第K个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第三个节点的值为4的节点。链表节点的定义如......
  • 【C++算法】35.位运算_两整数之和
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:371.两整数之和题目描述:解法笔试的话直接returna+b;接下来讲一下这题的解法:位运算(异或运算-无进位相加)例如:13和2813+28=4113的二进制位a:00110128的二进制位b:011100a^b:010001因为异或运算是无进......
  • 【C++算法】36.位运算_只出现一次的数字 II
    文章目录题目链接:题目描述:解法C++算法代码:解析题目链接:137.只出现一次的数字II题目描述:解法你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。说明时间复杂度O(n),空间复杂度O(1)意外发现出现1次的那个数和所有比特位当前的和%3得......
  • c++ 模板编程
    c++模板编程C++中模板分为函数模板和类模板函数模板:是一种抽象函数定义,它代表一类同构函数。类模板:是一种更高层次的抽象的类定义。优缺点优点代码复用  模板允许编写与具体数据类型无关的代码,从而实现代码复用。你可以针对不同的数据类型使用相同的模板函数或模板类,而......
  • C++小小复习一下
    类,对象,成员变量,成员函数特点:面向对象程序设计---因为要创建对象来调用类里面的函数或者成员变量比如你的对象是一个生物-人:他会有自己的一些属性:身高,体重,性别等,还有一些行为比如:有人惹他,他会骂回去或者打回去,这个骂和打的动作或者行为需要一系列的身体各个机能共同合作才能实......