C++实现单向链表定义以及增删改查详解

 代码实现:

#include <iostream>

using namespace std;

#define eleType int//定义链表数据类型

struct Lian{
    eleType data;//节点值
    Lian *next;//指向下一个节点的指针
    Lian(eleType x) : data(x),next(NULL){}//有参构造器
};

//链表处理的相关方法
class LinkedList{
private:
    Lian *head;//头节点
    int size;//元素数量

public:
    LinkedList() : head(NULL),size(0){}//构造函数
    ~LinkedList();//析构函数
//下面的都是函数声明
    void insert(int i,eleType value);
    void remove(int i);
    Lian *find(eleType value);
    Lian *get(int i);
    void update(int i,eleType value);
    void print();
};

//析构函数:自动释放内存空间
LinkedList ::~LinkedList() {
    Lian *curr=head;
    while (curr!=NULL){
       Lian *tmp =curr;
       curr=curr->next;
       delete tmp;
    }
}

//插入函数
void LinkedList::insert(int i, int value) {
    Lian *newNode=new Lian(value);
    if(i==0){
        newNode->next=head;
        head = newNode;
    }else{
        Lian *curr=head;
        for (int j = 0; j < i-1; ++j) {
            curr=curr->next;

        }
        newNode->next=curr->next;
        curr->next=newNode;
    }
    size++;
}

//删除函数
void LinkedList::remove(int i) {
    if(i==0){
        Lian *temp=head;
        head=head->next;
        delete temp;
    }else{
        Lian *curr=head;
        for (int j = 0; j < i-1; ++j) {
            curr=curr->next;
        }
        Lian *temp=curr->next;
        curr->next=temp->next;
        delete temp;
    }
    size--;
}

//查找函数
Lian *LinkedList::find(int value) {
    Lian *curr=head;
    while (curr&&curr->data!=value){
        curr=curr->next;
    }
    return curr;
}

//取值函数
Lian *LinkedList::get(int i) {
    Lian *curr=head;
    for (int j = 0; j < i-1; ++j) {
        curr=curr->next;
    }
    return curr;
}

//更新函数
void LinkedList::update(int i, int value) {
    get(i)->data==value;
}
void LinkedList::print() {
    Lian *curr=head;
    while (curr){
        cout<<curr->data<<" ";
        curr=curr->next;
    }
    cout<<endl;
}

int main(){

    return 0;
}

一、基本思想

  每个节点存储一个数值和一个指向下一个节点的指针,链表的遍历与顺序表不同,顺序表每个节点包含索引,可以直接找到,链表则是从第一个开始往后遍历,根据指向下一个节点的指针遍历。

二、链表定义

(1)节点构造(结构体)

节点用结构体构造,每个节点需要存储一个数据和指向下一节点的指针

(2)链表构造(类)

链表存储头指针和链表长度,以及相关方法的实现

三、函数讲解

(1)析构函数

析构函数主要用于遍历节点时的释放内存,tmp指针在遍历时最终为游离状态,因此需要对其做删除操作。

(2)插入函数

传进来需要插入的位置,与插入的值,先生成新的节点,然后根据i的值来判断插入的位置,在链表中从头节点开始遍历,遍历到相应的位置后,将遍历到的节点的下一个节点作为需要插入节点的下一个节点(也就是插入节点的指针指向当前遍历到的下一个节点),当前遍历到的节点指向插入节点,最后扩容size。

(3)删除函数(根据索引删除)

根据索引 i 查找删除节点的上一个节点,遍历i-1次,找到需要删除的前一个节点(前驱节点),然后将需要删除的节点存储到temp里面,然后将前驱节点的下一个节点变成删除节点的下一个节点,最后将删除节点删除,链表长度减一。

(4)查找函数(根据值查找)

直接从头节点开始遍历,比较节点数据与查找值,查找后返回当前节点。

(5)取值函数(根据索引取值)

根据索引从头节点开始遍历 i 次,最终遍历结束后的游标节点标记的值就是需要查找的节点。

(6)更新节点函数(根据索引找到指定位置)

直接调用取值函数,取值函数的返回的是节点,因此直接改变当前节点的DATA数据。

(7)打印链表

遍历链表将每个数据逐个打印出来。

三、插入与删除操作的图示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VegeIt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值