链表的基本内容

本文介绍了链表这种数据结构,包括单链表和双链表的概念。文章详细阐述了链表节点的构成,包含数据域和指针域,并提供了C++实现的链表类,包括添加、删除、插入和查找等基本操作。示例代码展示了如何在不同位置进行元素的增删改查,帮助理解链表操作的逻辑。
摘要由CSDN通过智能技术生成

链表是一种动态数据结构,可以用来表示顺序访问的线性群体。

链表是一系列结点组成,节点指向下一个结点的地址

单链表:链表每一个结点中只有一个指向后继结点的指针

双链向表:每个结点中有两个用于连接其他结点的指针,一个指向前趋结点(称前趋指针),拎一个指向后继结点(称后继指针)

结点类

结点包括数据域和指针域,数据域用于存放元素内容,元素的内容既可以是若干数据类型,也可以是自定义的类型的数据

结点域用于存放链表中另一个结点的地址

#include<iostream>
using namespace std;


class Point {
    int data;    //数据
    Point* next;//指针域
public:
    int getdata();
    void setdata(int data);
    Point* getnext();
    void setnext(Point* next);
};
int Point::getdata() {
    return data;
}
void Point::setdata(int data) {
    this->data = data;
}
Point* Point::getnext() {
    return this->next;
}
void Point::setnext(Point* next) {
    this->next = next;
}
class List {   //构造函数
    Point* head;
    int size;
public:
    List();
    bool add(int data);
    bool del(int posi);
    bool insert(int posi, int data);    //插入
    int find(int posi);    //遍历
};
List::List() {
    head = NULL;
    size = 0;
}

添加元素分为在头结点添加,和在非节点添加
bool List::add(int data) {
    Point* p = new Point();    //new一个对象指针
    p->setdata(data);        //p的数据域传进来
    if (head == NULL) {
        head = p;
        size++;
        return 1;
    }
    else {
        Point* q = head;    //创建指针q指向头结点

给节点添加

通过for循环找到结点位置
        for (int i = 0; i < size - 1; i++) {
            q = q->getnext();
        }
        q->setnext(p);
        size++;
        return 1;
    }
}
bool List::del(int posi) {
    if (posi<0 || posi>size) {        //判断位置是否合法
        return "del error";
    }

删除头节点,直接把头节点指向头节点的下一个结点就可以了,然后删除头节点

删除非头结点:要找到要删除的前一个结点,要将指针指向它的结点的下一个结点,然后删除结点就行了

删除尾结点:遍历找到尾结点的前一个结点

    //如果删除结点为头结点
    Point* q = head;
    if (posi == 0) {
        head = q->getnext();
        size--;
        delete(q);
        return 1;
    }
    //是你拿出结点为尾结点
    if (posi == size) {
        for (int i = 0; i < posi - 1; i++) {    //找到倒数第二个结点
            q = q->getnext();
        }
        delete(q->getnext());
        return 1;
    }
    //删除非头结点
    else {
        for (int i = 0; i < posi - 1; i++) {
            q = q->getnext();
        }
        Point* a = q->getnext();    //指向我们要删除的结点
        q->setnext(q->getnext()->getnext());
        delete(a);
        size--;
        return 1;
    }
}
bool List::insert(int posi, int data) {
    if (posi<0 || posi>size) {        //判断位置是否合理
        return "del error";
    }
    Point* p = new Point();
    p->setdata(data);
    Point* q = head;
    //如果插入为头结点
    if (posi == 0) {
        p->setnext(q);
        head = p;
        size++;
        return 1;
    }
    else {        //出入不是头结点
        for (int i = 0; i < posi - 1; i++)
            q = q->getnext();
        p->setnext(q->getnext());
        q->setnext(p);
        size++;
    }
}
int List::find(int posi) {
    if (posi<0 || posi>size) {
        cout << "del error" << endl;
        return 0;
    }
    Point* p = head;
    for (int i = 0; i < posi; i++) {
        p = p->getnext();
    }
    return p->getdata();
}

int main() {
    List l = List();
    l.add(1);
    l.add(3);
    l.add(3);
    l.add(4);
    l.add(5);
    l.add(6);
    cout << "改变前:" << endl;
    for (int i = 0; i < 6; i++) {
        cout << l.find(i) << " ";
    }
    cout << endl;
    l.insert(1, 2);
    l.del(3);
    cout << "改变后:" << endl;
    for (int i = 0; i < 6; i++) {
        cout << l.find(i) << " ";
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值