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; }
常量成员函数的设置有些小问题待修改。。