c语言编程笔录

首页 > C语言 > c语言

c语言

C++实现线性表链式存储(单链)

更新时间:2023-08-09

前言

线性表是数据结构中最基础、最常用的一种存储结构,它是由n个具有相同数据类型的元素构成的有序集合。线性表有两种主要的存储结构,即顺序存储和链式存储。本文将介绍使用C++实现线性表的链式存储(单链)。

代码实现

#include 

// 定义线性表节点结构
struct ListNode {
    int val; // 数据元素
    ListNode* next; // 指向下一个节点的指针
};

// 定义线性表类
class LinkedList {
private:
    ListNode* head; // 头指针,指向链表的第一个节点
    int size; // 线性表的大小

public:
    // 构造函数
    LinkedList() {
        head = nullptr; // 初始化头指针为空
        size = 0; // 初始大小为0
    }

    // 在链表末尾添加元素
    void add(int val) {
        ListNode* newNode = new ListNode;
        newNode->val = val;
        newNode->next = nullptr;

        if (head == nullptr) {
            head = newNode;
        } else {
            ListNode* cur = head;
            while (cur->next != nullptr) {
                cur = cur->next;
            }
            cur->next = newNode;
        }

        size++;
    }

    // 在指定位置插入元素
    void insert(int index, int val) {
        if (index < 0 || index > size) {
            std::cout << "Invalid index." << std::endl;
            return;
        }

        if (index == 0) {
            ListNode* newNode = new ListNode;
            newNode->val = val;
            newNode->next = head;
            head = newNode;
        } else {
            ListNode* cur = head;
            for (int i = 0; i < index - 1; i++) {
                cur = cur->next;
            }

            ListNode* newNode = new ListNode;
            newNode->val = val;
            newNode->next = cur->next;
            cur->next = newNode;
        }

        size++;
    }

    // 删除指定位置的元素
    void remove(int index) {
        if (index < 0 || index >= size) {
            std::cout << "Invalid index." << std::endl;
            return;
        }

        if (index == 0) {
            ListNode* temp = head;
            head = head->next;
            delete temp;
        } else {
            ListNode* cur = head;
            for (int i = 0; i < index - 1; i++) {
                cur = cur->next;
            }

            ListNode* temp = cur->next;
            cur->next = temp->next;
            delete temp;
        }

        size--;
    }

    // 获取指定位置的元素
    int get(int index) {
        if (index < 0 || index >= size) {
            std::cout << "Invalid index." << std::endl;
            return -1;
        }

        ListNode* cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur->next;
        }

        return cur->val;
    }

    // 获取线性表的大小
    int getSize() {
        return size;
    }
};

代码分析

上述代码实现了一个简单的线性表(单链表),其中包括了常见的操作,如添加元素、插入元素、删除元素、获取元素、获取线性表大小等。以下是对代码中各个方法的功能和规范解释:

1. 构造函数:构造函数用于初始化线性表对象,将头指针设置为空指针,并将大小初始化为0。

2. add方法:在链表末尾添加元素。遍历链表找到最后一个节点,将新节点链接到最后一个节点的next指针上。如果链表为空,则将新节点作为头结点。

3. insert方法:在指定位置插入元素。首先需要进行合法性判断,如果位置超出范围,则输出错误信息。如果要在链表头插入元素,则直接插入并更新头指针;否则,需要遍历链表找到指定位置的前一个节点,将新节点链接到前一个节点和当前节点之间。

4. remove方法:删除指定位置的元素。同样需要进行合法性判断。如果要删除链表头节点,则更新头指针。否则,遍历链表找到指定位置的前一个节点,将前一个节点的next指针指向被删除节点的下一个节点,并释放被删除节点的内存。

5. get方法:获取指定位置的元素。同样需要进行合法性判断。遍历链表找到指定位置的节点,并返回其存储的元素值。

6. getSize方法:获取线性表的大小(即节点数量),直接返回私有成员变量size的值。

总结

通过以上代码实现,我们可以使用C++创建一个链式存储的线性表。该实现具备常见的操作功能,如添加元素、插入元素、删除元素和获取元素等。链表的插入和删除操作只需修改指针的链接,不需要移动元素,因此能够高效地支持动态增删操作。使用链式存储,可以灵活地管理和操作线性表中的元素。