【c++版数据结构】之顺序表的实现
SeqList.h
#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
using namespace std; typedef enum{TRUE,FALSE}Status;
template<class Type>
class SeqList
{
private:
enum{DefaultSize = 10}; //顺序表的默认长度
Type *base; //存放元素数组的首地址
int capacity; //顺序表的容量
int size; //顺序表实际存放元素的个数
private://为内部函数所调用,不希望在类外訪问
bool IsFull()
{
if (size == capacity)
return true;
else
return false;
}
bool IsEmpty()
{
if (size == 0)
return true;
else
return false;
}
Status destory()
{
if (base == NULL)
return FALSE;
delete[] base;
base = NULL;
capacity = size = 0;
return TRUE;
}
public:
SeqList(int sz = DefaultSize)
{
capacity = sz > capacity ? sz : capacity;
base = new Type[capacity];
size = 0;
}
~SeqList()
{
destory();
}
Status push_back(const Type &x)
{
if (IsFull())
{
cout << "空间已满" << x << "不能插入" << endl;
return FALSE;
}
base[size++] = x;
return TRUE;
}
Status push_front(const Type &x)
{
if (IsFull())
{
cout << "空间已满" << x << "不能插入" << endl;
return FALSE;
}
for (int i = size - 1; i >= 0; --i) //------------------>从最后一个元素到第一个元素依次往后移动一个位置
base[i+ 1] = base[i];
base[0] = x;
size++;
return FALSE;
}
void show_list()
{
for (int i = 0; i < size; ++i)
cout << base[i] << " ";
cout << endl;
}
Status pop_back(Type &x)//将删除的元素存放在x中,以备不时之需
{
if (IsEmpty())
{ cout << "空间已空,不能删除" << endl;
return FALSE;
}
x = base[--size];
return TRUE;
}
Status pop_front(Type &x)
{
if (IsEmpty())
{
cout << "空间已空。不能删除" << endl;
return FALSE;
}
x = base[0];//将删除的元素保存在x中,以备不时之需
for (int i = 1; i <= size - 1; ++i) //--------------->从第二个元素到最后一个元素,依次覆盖前一个元素
base[i - 1] = base[i];
size--;
return TRUE;
}
Status insert_pos(int pos,const Type &x)
{
if (pos < 0 || pos >= size)
{
cout << "插入位置无效" << endl;
return FALSE;
}
if (IsFull())
{
cout << "空间已满" << x << "不能插入" << endl;
return FALSE;
}
for (int i = size - 1; i >= pos; --i)//--------------->从最后一个元素到所插入的位置的元素依次往后移动一个位置,为所要插入的元素留出位置
base[i + 1] = base[i];
base[pos] = x;
size++;
return TRUE;
}
Status delete_pos(int pos,Type &x)
{
if (pos < 0 || pos >= size)
{
cout << "删除位置无效" << endl;
return FALSE;
}
if (IsEmpty())
{
cout << "空间已空,不能删除" << endl;
return FALSE;
}
x = base[pos];
for (int i = pos + 1; i < size; ++i)//从删除位置后面的第一个元素開始依次覆盖前一个元素
base[i - 1] = base[i];
size--;
return TRUE;
}
int find(const Type &x)
{
for (int i = 0; i < size; ++i)
{
if (base[i] == x)
return i;
}
return -1;
}
void sort()//冒泡排序
{
for (int i = 0; i < size - 1; ++i)//排序size-1次
{
for (int j = 0; j < size - 1 - i; ++j)
{
if (base[j] > base[j + 1])
{
Type tmp = base[j];
base[j] = base[j + 1];
base[j + 1] = tmp;
}
}
} }
void reserve()//左右对称位置交换
{
int left = 0;
int right = size - 1;
while (left < right)
{
Type tmp = base[left];
base[left] = base[right];
base[right] = tmp;
left++;
right--;
}
}
Status insert_val(const Type &x)
{
if (IsFull())
{
cout << "空间已满" << x << "不能按值插入" << endl;
return FALSE;
}
sort();
for (int i = 0; i < size; ++i)
{
if (base[i] > x)//存在比所要插入元素大的元素,在该位置插入它
{
insert_pos(i, x);
return TRUE;
}
}
base[size++] = x;//不存在比所要插入元素大的元素,在最后位置插入它
return TRUE;
}
/*
Status insert_val(const Type &x)//用while取代for
{
if (IsFull())
{
cout << "空间已满" << x << "不能按值插入" << endl;
return FALSE;
}
sort();
int i = 0;
while(i<size && x > base[i])
{
i++;
}
insert_pos(i,x);
return TRUE;
}
*/
Status delete_val(const Type &x)
{
int n = find(x);
if (n == -1)
{
cout <<x<< "不存在,无法删除" << endl;
return FALSE;
}
Type item;
delete_pos(n, item);
return TRUE;
}
void clear()
{
size = 0;
}
};
#endif
main.cpp
#include"SeqList.h" int main()
{
SeqList<int> mylist;
int item;
int n;
int select = 1;
while (select)
{
cout << "*************************************** *" << endl;
cout << "*[1] push_back [2] push_front *" << endl;
cout << "*[3] show_list [4] pop_back *" << endl;
cout << "*[5] pop_front [6] insert_val *" << endl;
cout << "*[7] insert_pos [8] find *" << endl;
cout << "*[9] delete_pos [10] delete_val*" << endl;
cout << "*[11] sort [12] reserve *" << endl;
cout << "*[13] destory [14] clear *" << endl;
cout << "*[0] quit_system [0] quit_system*" << endl;
cout << "请选择:>";
cin >> select;
switch (select)
{
case 1:
cout << "请输入要插入的元素(-1结束):>";
while (cin >> item, item != -1)
{
mylist.push_back(item);
}
break;
case 2:
cout << "请输入要插入的元素(-1结束):>";
while (cin >> item, item != -1)
{
mylist.push_front(item);
}
break;
case 3:
mylist.show_list();
break;
case 4:
mylist.pop_back(item);
break;
case 5:
mylist.pop_front(item);
break;
case 6:
cout << "请输入要插入的元素:";
cin >> item;
mylist.insert_val(item);
break;
case 7:
cout << "请输入要插入的位置:";
cin >> n;
cout << "请输入要插入的元素:";
cin >> item;
mylist.insert_pos(n,item);
break;
case 8:
cout << "请输入要查找的元素:";
cin >> item;
cout << mylist.find(item) << endl;
break;
case 9:
cout << "请输入要删除的位置:";
cin >> n;
mylist.delete_pos(n,item);
break;
case 10:
cout << "请输入要删除的元素:";
cin >> item;
mylist.delete_val(item);
break;
case 11:
mylist.sort();
break;
case 12:
mylist.reserve();
break;
case 14:
mylist.clear();
break;
default:
break;
}
}
system("pause");
return 0;
}
【c++版数据结构】之顺序表的实现的更多相关文章
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- 【PHP数据结构】顺序表(数组)的相关逻辑操作
在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- [数据结构]C#顺序表的实现
在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...
- 数据结构之顺序表,c#实现
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...
- Java——数据结构(顺序表)
这是一个顺序表的类,初始化的时候就已经确定了表的长度,之后不能添加数据,因为使用的是数组存储的数据,不过这个表的类型是泛型的. public class List { private Object[] ...
- javascript数据结构之顺序表
关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间 ...
随机推荐
- spring batch(一):基础部分
spring batch(一):基础部分 博客分类: Spring java spring batch 官网: http://www.springsource.org/spring-batch 下 ...
- emacs使用本地emacs server模式打开远程文件
使用emacs的用户都知道,一般要打开远程机器上的文件要使用TrampMode模式,调用方式例如以下: C-x C-f /remotehost:filename RET (or /method:use ...
- [C#] 怎样分析stackoverflow等clr错误
有时候由于无限递归调用等代码错误,w3wp.exe会报错退出.原因是clr.exe出错了. 这样的错误比較难分析,由于C#代码抓不住StackOverflowException等异常. 处理方法是:生 ...
- 怎样避免使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK之后的黑屏问题
在自己的项目中.我须要使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK来開始新的activity同一时候移除之前全部的 ...
- c# DataTable to Object Mapping
public static class DataTableExtensions { public static IList<T> ToList<T>(this DataTabl ...
- ExtJs--16--Ext.override()方法专门用来重写对象的方法
Ext.onReady(function(){ /** * Ext.override()方法专门用来重写对象的方法 */ //定义个类 Ext.define("U",{ //该类的 ...
- 两个NSMutableDictionary合并成一个NSMutableDictionary
解决方案: NSMutableDictionary *targetMutableDictionary = [mutableDictionary1 copy]; [targetMutableDictio ...
- c# TextBox
1. text内容全选事件 textBox1.selectAll(); 2.失去与获取焦点事件 textox1.LostFocus += new EventHandler(txt_LostFocus) ...
- 关于数据未渲染完,要获取document高度问题——ajax全局事件
昨天在做开发时,遇到这样一个问题,当页面刚加载的时候,就要获取document的高度,可是此时页面上所有的ajax请求的数据都还没有渲染到页面上,所以导致得到的document的高度仅仅是页面结构的高 ...
- 用Latex做介绍自己和团队科研的网页
最近实验室师妹用网上的一些模板改了改做了几个网页.感觉还可以.但是实际上总觉得好像和韩家炜.周志华他们的页面差点什么. 最近找论文时发现奥地利的hornik老先生页面居然latex做的,然后找到了下面 ...