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

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

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

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

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

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

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

基于数组的静态版本:

#ifndef SEQLIST_H
#define SEQLIST_H const int MAX_SIZE = ;
template <class T>
class SeqList {
private:
T node[MAX_SIZE];
int size = ;
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-] = x;
return true;
}
return false;
} template <class T>
bool SeqList<T>::insert(int i, const T& x) {
if (size <= MAX_SIZE && i >= && i <= size) {
++size;
for (int k = size-; k != i; --k) {
node[k] = node[k-];
}
node[i] = x;
return true;
}
return false;
} template <class T>
bool SeqList<T>::remove(int i) {
if (i >= && i <= size) {
for (int k = i; k != size; ++k) {
node[k] = node[k+];
}
--size;
return true;
}
return false;
} template <class T>
int SeqList<T>::search(T& x) {
for (int i = ; i != size; ++i) {
if (node[i] == x) return i;
}
return -;
} template <class T>
T& SeqList<T>::getNode(int i){
if (i >= && i < size) {
return
node[i];
}
};

#ifndef STUDENT_H
#define STUDENT_H #include <string>
#include <stdio.h> struct Student {
int no = ;
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(, "张三", "", );
Student s2(, "李四", "", );
Student s3(, "王五", "", );
Student s4(, "马六", "", );
Student s5(, "黄荣", "", ); list.add(s1);
list.add(s2); printf("step-a\n");
for (int i = ; i != list.getSize(); ++i) {
list.getNode(i).display();
} list.insert(, s3);
list.insert(, s4);
list.insert(, s5); printf("step-b\n");
for (int i = ; i != list.getSize(); ++i) {
list.getNode(i).display();
} list.remove();
list.remove(); printf("step-c\n");
for (int i = ; i != list.getSize(); ++i) {
list.getNode(i).display();
} printf("step-d\n");
if (list.search(s5) == -) {
printf("不存在\n");
} else {
s5.display();
}
Student s6(, "郭靖", "", );
if (list.search(s6) == -) {
printf("不存在\n");
} else {
s6.display();
} printf("step-e\n");
for (int i = ; 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 = ; i != list.getSize(); ++i) {
list.getNode(i).display();
}
cout << "########################MAXSIZE=512#########" << endl;
cout << "请选择您的操作1增2删3改4查:" << endl;
int order = ;
cin >> order;
if (order < || order > ) {
cout << "无效命令!\n" << endl;
} else {
switch (order) {
case : {
cout << "请输入学生的学号和姓名:" << endl;
int no = ;
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 : {
cout << "请输入学生座号:" << endl;
int num;
cin >> num;
if (!list.remove(num)) {
cout << "不好意思,这个学生不存在" << endl;
}
break;
}
case : {
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 : {
cout << "请输入需要查找的学生姓名:" << endl;
string name;
cin >> name;
Student s;
s.name = name;
if (list.search(s) == -) {
cout << "抱歉,没找到这名同学。" << endl;
} else {
cout << "该同学信息如下:" << endl;
list.getNode((list.search(s))).display();
}
break;
}
}
}
system("pause");
} return ;
}

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

C++ 顺序表实现的更多相关文章

  1. jdk顺序表笔记

    一.AbstractCollection 提供了集合的最大实现 继承该类,必须实现size()和iterator(),因为该类操作集合都是通过iterator 二.fail-fast策略 该策略在集合 ...

  2. c++顺序表基本功能

    头文件 #define LIST_MAX_SIZE 5#define LISTINCREMENT 2#include<assert.h>#include<string>temp ...

  3. 数据结构:顺序表(python版)

    顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...

  4. 《数据结构》2.2顺序表(sequence list)

    //顺序表节点的定义 typedef struct { datatype data[MAXSIZE]; //数组容量的上限 int len; //记录最后一个元素的位置,相当于一个指针,表空时len= ...

  5. c数据结构 顺序表和链表 相关操作

    编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...

  6. java顺序表和树的实现

    一.顺序表 1.线性表 //java顺序表的实现,如ArrayList就是用线性表实现的,优点是查找快,缺点是添加或删除要移动很多元素,速度慢 public class SequenceList { ...

  7. 数据结构顺序表删除所有特定元素x

    顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...

  8. 顺序表C语言版

    #include <stdio.h> /* * 顺序表最多输入N个数 */ #define N 10 #define OK 1 #define ERROR -1 struct sequeu ...

  9. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  10. C语言 线性表 顺序表结构 实现

    一个能够自动扩容的顺序表 ArrList (GCC编译). #include <stdio.h> #include <stdlib.h> #include <string ...

随机推荐

  1. 【BZOJ4881】5月月赛D 线段游戏 树状数组+set

    Description quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,. ...

  2. Java操作文件转码

    package downloadTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...

  3. GROUP_CONCAT 拼接顺序

    用 group_concat 拼接后的顺序 group_concat(id order by id) 里面id更新需要更换

  4. python基础-第十三篇-13.1web框架本质

    基础与概念 众所周知,对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 web框架分两类:一类是包括socket和业务逻辑(tornado),另一 ...

  5. Django 框架之Form组件

    1. Django的Form主要具有以下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交的数据 初始化页面显示内容 2. 第一个案例: # 第一步: 创建 ...

  6. 16.Update Methods-官方文档摘录

    这里没什么好说的,直接贴文了 MongoDB provides the following methods for updating documents in a collection: db.col ...

  7. Python性能优化的20条建议

    优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...

  8. python发送邮件的2种方式

    发送邮件的2种方式1.匿名发送 smtpObj = smtplib.SMTP(host, port) smtpObj.sendmail(from_addr, to_addrs, message.as_ ...

  9. 简明python教程八----输入/输出

    通过创建一个file类的对象来打开一个文件,分别使用file类的read.readline或write方法来读写文件. 最后调用一个close方法来告诉Python我们完成了对文件的使用. poem= ...

  10. 8种主要排序算法的C#实现 (一)

    简介 排序算法是我们编程中遇到的最多的算法.目前主流的算法有8种. 平均时间复杂度从高到低依次是: 冒泡排序(o(n2)),选择排序(o(n2)),插入排序(o(n2)),堆排序(o(nlogn)), ...