C++ 顺序表实现
线性表就是字面上的意思,

顺序表是线性表基于数组的一种实现,
“顺序”这个名字怎么来的并不清楚,可以勉强解释为“存储地址是连续、顺序的”。
另外两种线性表实现分别是“基于链表”和“散列存储”。
顺序表可以是动态的,也可以是静态的,
“静态”就是一开始就知道表容量,并且这个容量在之后无法被更改;
“动态”就是能够动态的改变表的容量,实现上基于动态内存分配。
基于数组的静态版本:
#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++ 顺序表实现的更多相关文章
- jdk顺序表笔记
一.AbstractCollection 提供了集合的最大实现 继承该类,必须实现size()和iterator(),因为该类操作集合都是通过iterator 二.fail-fast策略 该策略在集合 ...
- c++顺序表基本功能
头文件 #define LIST_MAX_SIZE 5#define LISTINCREMENT 2#include<assert.h>#include<string>temp ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- 《数据结构》2.2顺序表(sequence list)
//顺序表节点的定义 typedef struct { datatype data[MAXSIZE]; //数组容量的上限 int len; //记录最后一个元素的位置,相当于一个指针,表空时len= ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- java顺序表和树的实现
一.顺序表 1.线性表 //java顺序表的实现,如ArrayList就是用线性表实现的,优点是查找快,缺点是添加或删除要移动很多元素,速度慢 public class SequenceList { ...
- 数据结构顺序表删除所有特定元素x
顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...
- 顺序表C语言版
#include <stdio.h> /* * 顺序表最多输入N个数 */ #define N 10 #define OK 1 #define ERROR -1 struct sequeu ...
- C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
- C语言 线性表 顺序表结构 实现
一个能够自动扩容的顺序表 ArrList (GCC编译). #include <stdio.h> #include <stdlib.h> #include <string ...
随机推荐
- public, protected, private,internal,protected internal的区别
虽然这个知识比较简单, 但是老是会忘, 写上来, 增强记忆. 在C#语言中,共有五种访问修饰符:public.private.protected.internal.protected internal ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory
[已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 结论是: 当前有个bug: 默认是通过 hw.ramSize=1024 ...
- Objective-C代码学习大纲(4)
2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...
- ios 对日期的处理(包括计算昨天时间、明天时间)
NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是不可改变的. 如 ...
- Caused by: java.lang.ClassNotFoundException[android的终极解决错误]
from:http://blog.csdn.net/changemyself/article/details/7861525 08-13 18:29:22.924: E/AndroidRuntime( ...
- ie8兼容:对象不支持“trim”属性或方法
trim() 方法是原生js中去空格的方法,高版本浏览器已经默认支持trim() 方法,但ie8以下不支持,会报错:对象不支持“trim”属性或方法 解决这个的兼容,只需要扩展String原型属性 在 ...
- 02.ZooKeeper的Java客户端使用
1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端 zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...
- Oracle涂抹oracle学习笔记第10章Data Guard说,我就是备份
DG 是备份恢复工具,但是更加严格的意义它是灾难恢复 Data Guard是一个集合,由一个Primary数据库及一个或者多个Standby数据库组成,分两类逻辑Standby和物理Standby 1 ...
- c# 解析json 字符串 报异常 Bad JSON escape sequence 解决方案
当我试图将一个完整的本地路径的字符串串(如:c:\\aaa\\数学题\\三一班\\ea15ae66-d5cd-4244-87e4-fcf97b06b407.jpg)encodeURL之后当做一个页面参 ...
- C# ArcEngine 实现点击要素高亮并弹出其属性
本文是模仿ArcMap里面的Identify(识别)功能,通过点击要素,使其高亮显示并弹出其属性表!本文只做了点击查询! 本文所用的环境为VS2010,AecEngine基于C#语言,界面是用Dev做 ...