C++ 顺序表实现

线性表就是字面上的意思,

顺序表是线性表基于数组的一种实现,

“顺序”这个名字怎么来的并不清楚,可以勉强解释为“存储地址是连续、顺序的”。

 另外两种线性表实现分别是“基于链表”和“散列存储”。

顺序表可以是动态的,也可以是静态的,

“静态”就是一开始就知道表容量,并且这个容量在之后无法被更改;

“动态”就是能够动态的改变表的容量,实现上基于动态内存分配。

 

基于数组的静态版本:

#ifndef SEQLIST_H
#define SEQLIST_H

const int MAX_SIZE  = 512;
template <class T>
class SeqList {
private:
    T node[MAX_SIZE];
    int size = 0;
public:
    int getSize() const { return size; }
    bool add(const T& x);
    bool insert(int i, const T& x);
    bool remove(int i);
    int search(T& x);
    T& getNode(int i);
};    

#endif

template <class T>
bool SeqList<T>::add(const T& x) {
    if (size <= MAX_SIZE) {
        ++size;
        node[size-1] = x;
        return true;
    }
    return false;
}

template <class T>
bool SeqList<T>::insert(int i, const T& x) {
    if (size <= MAX_SIZE && i >= 0 && i <= size) {
        ++size;
        for (int k = size-1; k != i; --k) {
            node[k] = node[k-1];
        }
        node[i] = x;
        return true;
    }
    return false;
}

template <class T>
bool SeqList<T>::remove(int i) {
    if (i >= 0 && i <= size) {
        for (int k = i; k != size; ++k) {
            node[k] = node[k+1];
        }
        --size;
        return true;
    }
    return false;
}

template <class T>
int SeqList<T>::search(T& x) {
    for (int i = 0; i != size; ++i) {
        if (node[i] == x) return i;
    }
    return -1;
}

template <class T>
T& SeqList<T>::getNode(int i){
    if (i >= 0 && i < size) {
        return node[i];
    }
};

#ifndef STUDENT_H
#define STUDENT_H

#include <string>
#include <stdio.h>

struct Student {
    int no = 0;
    std::string name;
    std::string grade;
    double goal = 0.0;
    Student() = default;
    Student(int arg1, const std::string& arg2, 
        const std::string& arg3, double arg4): no(arg1), name(arg2), grade(arg3), goal(arg4) {}
    void display() const {
        printf("%d %s %s %.2f\n", no, name.c_str(), grade.c_str(), goal);
    }
    bool operator==(const Student &c1) {
        if (c1.name == this->name || c1.no == this->no && c1.grade == this->grade) return true;
        return false;
    }
};

#endif

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    SeqList<Student> list;
    
    Student s1(1, "张三", "2005", 70);
    Student s2(2, "李四", "2004", 65);
    Student s3(3, "王五", "2005", 80);
    Student s4(4, "马六", "2006", 90);
    Student s5(5, "黄荣", "2004", 85);
    
    list.add(s1);
    list.add(s2);
    
    printf("step-a\n");
    for (int i = 0; i != list.getSize(); ++i) {
        list.getNode(i).display();
    }
    
    list.insert(0, s3);
    list.insert(2, s4);
    list.insert(4, s5);

    printf("step-b\n");
    for (int i = 0; i != list.getSize(); ++i) {
        list.getNode(i).display();
    }
    
    list.remove(0);
    list.remove(3);
    
    printf("step-c\n");
    for (int i = 0; i != list.getSize(); ++i) {
        list.getNode(i).display();
    }    
    
    printf("step-d\n");
    if (list.search(s5) == -1) {
        printf("不存在\n");
    } else {
        s5.display();
    }    
    Student s6(6, "郭靖", "2004", 85);
    if (list.search(s6) == -1) {
        printf("不存在\n");
    } else {
        s6.display();
    }
    
    printf("step-e\n");
    for (int i = 0; i != list.getSize(); ++i) {
        list.getNode(i).display();
    }
    
    printf("step-f\n");
    system("pause");
    while (true) {
        system("cls");
        cout << "#####WINDOWS##EDITION#####################" << endl;
        for (int i = 0; i != list.getSize(); ++i) {
            list.getNode(i).display();
        }
        cout << "########################MAXSIZE=512#########" << endl;
        cout << "请选择您的操作1增2删3改4查:" << endl;
        int order = 0;
        cin >> order;
        if (order < 1 || order > 4) {
            cout << "无效命令!\n" << endl;
        } else {
            switch (order) {
                case 1: {
                    cout << "请输入学生的学号和姓名:" << endl;
                    int no = 0;
                    string name;
                    cin >> no >> name;
                    cout << "请输入学生的学级和分数:" << endl;
                    string grade;
                    double goal = 0.0;
                    cin >> grade >> goal;
                    Student s(no, name, grade, goal);
                    list.add(s);
                    break;
                }
                case 2: {
                    cout << "请输入学生座号:" << endl;
                    int num;
                    cin >> num;
                    if (!list.remove(num)) {
                        cout << "不好意思,这个学生不存在" << endl;
                    }
                    break;
                }
                case 3: {
                    cout << "请输入需要修改的学生的座号:" << endl;
                    int num;
                    cin >> num;
                    cout << "您要修改的是" << list.getNode(num).name << "...,请输入新数据以覆盖原始数据:" << endl;
                    cin >> list.getNode(num).no
                        >> list.getNode(num).name
                        >> list.getNode(num).grade
                        >> list.getNode(num).goal;
                    break;
                }
                case 4: {
                    cout << "请输入需要查找的学生姓名:" << endl;
                    string name;
                    cin >> name;
                    Student s;
                    s.name = name;
                    if (list.search(s) == -1) {
                        cout << "抱歉,没找到这名同学。" << endl;
                    } else {
                        cout << "该同学信息如下:" << endl;
                        list.getNode((list.search(s))).display();
                    }
                    break;
                }
            }
        }
        system("pause");
    }
    
    return 0;
}

常量成员函数的设置有些小问题待修改。。

posted @ 2017-09-24 20:43  xkfx  阅读(943)  评论(0编辑  收藏  举报