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 ...
随机推荐
- jquery 判断ul下是否存在li
$("ul").has("li").length > 0;$("ul > li").length > 0;$(" ...
- Windows下IPython安装
1:安装Python, 下载后安装即可:https://www.python.org/downloads/windows/,(选择Python2或Python3) 添加Path环境变量 2:安装ez_ ...
- poj_2823 单调队列
题目大意 给定一行数,共N个.有一个长度为K的窗口从左向右滑动,窗口中始终有K个数字,窗口每次滑动一个数字.求各个时刻窗口中的最大值和最小值. 题目分析 直接搜索,复杂度为O(n^2).考虑使用单调队 ...
- 【BZOJ5071】[Lydsy十月月赛]小A的数字 发现性质
[BZOJ5071][Lydsy十月月赛]小A的数字 题解:一般遇到这种奇奇怪怪的操作,常用的套路是将原序列差分一下,或者求个前缀和什么的.本题就是直接对原序列求前缀和,然后发现一次操作相当于交换两个 ...
- 用Dialog 做自定义动画,加播放监听
final Dialog customDialog = new Dialog(this); customDialog.setTitle(R.string.attention); customDialo ...
- Code Forces 21C Stripe 2
C. Stripe 2 time limit per test 1 second memory limit per test 64 megabytes input standard input out ...
- java面试基础题------》int Integer Integer.valueOf
在jdk1.5的环境下,有如下4条语句: 1 2 3 4 Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integ ...
- d3.js 之关联数据:data操作符
数据可视化 在可视化工作中,一个基本出发点是将不同的数值映射到不同的可视化 元素的属性上,使其表现出各自不同的视觉特征. 比如:以数组中的每一个值为直径分别创建一个圆,我们得到三个圆: 在d3中,可视 ...
- 如何在 windows 配置 libtorch c++ 前端库?
如何在 windows 配置 libtorch c++ 前端库? 下载 pytorch 已经编译好的库: 此库不带 gpu,主要方便演示.支持 win7 win10 系统. 下载地址:https:// ...
- django URL的补充 默认值 传多个参数
url 后面还可以加上默认值 默认值 url(r'^index/', views.index, {'name': 'root'}), urls.py url对应关系 from django.conf. ...