线性表

[百度]百度

//顺序表  
class SeqList {  
private:  
    E *data;  //存储数据的数组  
    int maxSize;  //最大容量  
    int last;  //当前长度  
public:  
    //初始化  
    SeqList(int sz) {        maxSize = sz; //设置最大容量  
        data = new E[maxSize]; //动态分配数组空间  
        last = -1; //空表  
    }    //判空  
    bool isEmpty() const {        return last == -1;    }    //判满  
    bool isFull() const {        return last == maxSize - 1;    }    //插入  
    void insert(int i, E x) {        if (isFull()) {            cout << "上溢" << endl;  
            return;        }        if (i < 0 || i > last + 1) {            cout << "位置非法" << endl;  
            return;        }        for (int j = last; j >= i; j--)            data[j + 1] = data[j];  
        data[i] = x;        last++;    }    //删除  
    void remove(int i) {        if (isEmpty()) {            cout << "下溢" << endl;  
            return;        }        if (i < 0 || i > last) {            cout << "位置非法" << endl;  
            return;        }        for (int j = i; j < last; j++)            data[j] = data[j + 1];        last--;    }    //获取长度  
    int length() const {        return last + 1;    }    //按位置获取元素  
    E get(int i) {        if (i < 0 || i > last) {            cout << "位置非法" << endl;  
            return -1;        }        return data[i];    }    //按值查找位置  
    int locate(E x) {        int low = 0, high = last, mid;        while (low <= high) {            mid = (low + high) / 2;            if (data[mid] == x)                return mid;            else if (data[mid] > x)                high = mid - 1;            else                low = mid + 1;        }        return -1;    }    //测试:输出元素  
    void print() {        for (int i = 0; i <= last; i++)            cout << data[i] << " ";        cout << endl;    }    //析构函数  
    ~SeqList() {        delete[] data; //释放数组空间  
    }};  
//单链表  
class LNode {  
public:  
    E data{}; //数据域  
    LNode *next; //指针域,后继  
    LNode() { //构造函数  
        next = nullptr;    }    LNode(E e) { //构造函数  
        data = e;        next = nullptr;    }};  
  
class LinkList {  
public:  
    LNode *head; //头结点  
    LinkList() { //构造函数  
        head = new LNode();    }    ~LinkList() { //析构函数  
        delete head;    }    //插入结点  
    bool InsertNode(int i, E e) const { //参数:插入位置,插入元素  
        if (i < 1) return false; //i值不合法  
        LNode *p; //定义一个指针p  
        int j = 0; //计数器  
        p = head; //p指向头结点  
        while (p != nullptr && j < i - 1) { //循环找到第i-1个结点  
            p = p->next;            j++;        }        if (p == nullptr) return false; //i值不合法,合法性取决于i-1的位置是否存在  
        LNode *s = new LNode(e); //生成新结点  
        s->next = p->next; //将新结点插入到第i-1个结点之后  
        p->next = s;        return true;    }    //删除结点  
    bool DeleteNode(int i, E &e) const {        if (i < 1) return false; //i值不合法  
        LNode *p; //定义一个指针p  
        int j = 0; //计数器  
        p = head; //p指向头结点  
        while (p != nullptr && j < i - 1) { //循环找到第i-1个结点  
            p = p->next;            j++;        }        if (p == nullptr) return false; //i值不合法  
        if (p->next == nullptr) return false; //第i-1个结点之后已无其他结点  
        LNode *q = p->next; //令q指向被删除结点  
        e = q->data; //用e返回被删除结点的值  
        p->next = q->next; //将*q结点从链中“断开”  
        delete q; //释放结点的存储空间  
        return true;    }    //查找结点  
    [[nodiscard]] LNode *GetNode(int i) const { //返回值为结点指针  
        if (i < 0) return nullptr; //i值不合法  
        LNode *p; //定义一个指针p  
        int j = 0; //计数器  
        p = head; //p指向头结点  
        while (p != nullptr && j < i) { //循环找到第i个结点  
            p = p->next;            j++;        }        return p;    }    //按值查找  
    [[nodiscard]] LNode *LocateNode(E e) const { //返回值为结点指针  
        LNode *p = head->next; //p指向首结点  
        while (p != nullptr && p->data != e) { //循环查找  
            p = p->next;        }        return p;    }    //打印链表  
    void PrintList() const {        LNode *p = head->next; //p指向首结点  
        while (p != nullptr) { //p所指结点存在  
            cout << p->data << " "; //输出p所指结点的值  
            p = p->next; //p指向下一个结点  
        }        cout << endl;    }};