《数据结构、算法与应用》9.(C++实现顺序表)

最近在读《数据结构、算法与应用》这本书,把书上的习题总结一下,用自己的方法来实现了这些题,可能在效率,编码等方面存在着很多的问题,也可能是错误的实现,如果大家在看这本书的时候有更优更好的方法来实现,还请大家多多留言交流多多指正,谢谢

9. C++实现的线性表--顺序表

//
//  LinearList.h
//  LinearList
//
//  Created by cc on 14-8-21.
//  Copyright (c) 2014年 cc. All rights reserved.
//  顺序表

#ifndef __LinearList__LinearList__
#define __LinearList__LinearList__

#include <iostream>
#include <stdlib.h>

using namespace std;

template <class T>
class LinearList {

private:

    //顺序表长度
    int m_length;
    //顺序表最大的长度
    int m_maxSize;
    //元素数组
    T* m_element;

public:

    LinearList(int maxListSize);
    virtual ~LinearList();

    /**
     *	@brief	顺序表是否为空
     *
     *	@return	true: 空 false: 非空
     */
    bool isEmpty() const;

    /**
     *	@brief	获取顺序表的长度
     *
     *	@return 顺序表的长度
     */
    int length() const;

    /**
     *	@brief	获取顺序表最大容量
     *
     *	@return	顺序表的最大容量
     */
    int maxSize() const;

    /**
     *	@brief	    在顺序表中查找第k个元素,并返回第k个元素至x中
     *
     *	@param 	k 	第k个元素
     *	@param 	x 	保存第k个元素
     *
     *	@return	true: 找到了第k个元素 false: 没找到第k个元素
     */
    bool find(int k, T& x) const;

    /**
     *	@brief	查找顺序表中的元素x, 并且返回x所在位置
     *
     *	@param 	x 	元素x
     *
     *	@return	元素x的在顺序表中的位置
     */
    int search(const T& x) const;

    /**
     *	@brief  删除第k个元素并将它返回至x中
     *
     *	@param 	k 	第k个元素
     *	@param 	x 	保存第k个元素
     *
     *	@return	修改后的顺序表
     */
    LinearList<T>& deleteElement(int k, T& x);

    /**
     *	@brief  在第k个元素之后插入x元素
     *
     *	@param 	k 	第k个元素
     *	@param 	x 	元素x
     *
     *	@return	修改后的顺序表
     */
    LinearList<T>& insertElement(int k, const T& x);

    /**
     *	@brief	输出信息
     *
     *	@param 	out 	输出流
     */
    void output(ostream& out) const;

};

template <class T>
LinearList<T>::LinearList(int maxListSize):m_length(0), m_element(NULL) {
    this->m_maxSize = maxListSize;
    this->m_element = new T[this->m_maxSize];
}

template <class T>
LinearList<T>::~LinearList() {
    delete [] this->m_element;
    this->m_element = NULL;
}

/**
 *	@brief	顺序表是否为空
 *
 *	@return	true: 空 false: 非空
 */
template <class T>
bool LinearList<T>::isEmpty() const {
    return this->m_length == 0;
}

/**
 *	@brief	获取顺序表的长度
 *
 *	@return 顺序表的长度
 */
template <class T>
int LinearList<T>::length() const {
    return this->m_length;
}

/**
 *	@brief	获取顺序表最大容量
 *
 *	@return	顺序表的最大容量
 */
template <class T>
int LinearList<T>::maxSize() const {
    return this->m_maxSize;
}

/**
 *	@brief	    在顺序表中查找第k个元素,并返回第k个元素至x中
 *
 *	@param 	k 	第k个元素
 *	@param 	x 	保存第k个元素
 *
 *	@return	true: 找到了第k个元素 false: 没找到第k个元素
 */
template <class T>
bool LinearList<T>::find(int k, T& x) const {
    if (k > this->m_length - 1
        || k < 0) {
        cout << "在顺序表中为找到第" << k << "个位置上的元素";
        return false;
    }

    x = m_element[k];
    return true;
}

/**
 *	@brief	查找顺序表中的元素x, 并且返回x所在位置(位置是下标+1)
 *
 *	@param 	x 	元素x
 *
 *	@return	元素x的在顺序表中的位置
 */
template <class T>
int LinearList<T>::search(const T& x) const {
    for (int i = 0; i < this->m_length; i++) {
        if (this->m_element[i] == x) {
            return i;
        }
    }
    return 0;
}

/**
 *	@brief  删除第k个元素并将它返回至x中
 *
 *	@param 	k 	第k个元素
 *	@param 	x 	保存第k个元素
 *
 *	@return	修改后的顺序表
 */
template <class T>
LinearList<T>& LinearList<T>::deleteElement(int k, T& x) {
    if (find(k, x)) {
        //找到了第k个元素
        for (int i = k; i < this->m_length - 1; i++) {
            this->m_element[i]  = this->m_element[i + 1];
        }
        this->m_length--;
    } else {
        // throws exception
        cout << "未找到第" << k << "个元素";
    }
    return *this;
}

/**
 *	@brief  在第k个元素之后插入x元素
 *
 *	@param 	k 	第k个元素
 *	@param 	x 	元素x
 *
 *	@return	修改后的顺序表
 */
template <class T>
LinearList<T>& LinearList<T>::insertElement(int k, const T& x) {

    if (k > m_maxSize - 1
        || k < 0) {
        cout << "数组下标越界!" << endl;
        // throws OutOfBoundsException
    } else if (this->m_length == this->m_maxSize) {
        cout << "已达到数组最大容量,申请内存后再添加!" << endl;
        // throws NoMemException
    } else {
        //找到了第k个元素
        for (int i = this->m_length - 1; i > k; i--) {
            this->m_element[i] = this->m_element[i - 1];
        }
        this->m_length++;
        this->m_element[k] = x;
    }

    return *this;
}

template<class T>
void LinearList<T>::output(ostream& out) const {
    for (int i = 0; i < this->m_length; i++)
        out << this->m_element[i] << "  ";
}

// overload
template <class T>
ostream& operator<<(ostream& out, const LinearList<T>& x){
    x.output(out); return out;
}

#endif /* defined(__LinearList__LinearList__) */
//
//  main.cpp
//  LinnerList
//
//  Created by ChengChao on 14-8-29.
//  Copyright (c) 2014年 cc. All rights reserved.
//

#include <iostream>
#include <stdlib.h>
#include "LinearList.h"

int main(int argc, const char * argv[]) {

    LinearList<int> list(10);

    list.insertElement(0, 1000).insertElement(1, 312).insertElement(2, 134);
    cout << "The list is" << endl;
    cout << list << endl;

    //顺序表是否为空
    cout << "顺序表是否为空:" << boolalpha << list.isEmpty() << endl;
    cout << "顺序表的最大容量:" << list.maxSize() << endl;

    int res = 0;
    int res2 = 0;
    //查找99
    cout << "查找第0个元素输入到res变量中,是否找到: " << boolalpha << list.find(0, res) << ",res=" << res << endl;
    //查找312
    cout << "查找第5个元素输入到res变量中,是否找到: " << boolalpha << list.find(5, res2) << ",res=" << res2 << endl;

    //删除第1个位置上的元素元素
    list.deleteElement(1, res);
    cout << list << endl;

    //查找元素134
    cout << "搜索元素134,位置为:" << list.search(134) << endl;

    return 0;
}

&#8;输出结果如下图:

注意C++中的模板不支持编译分离,需要把模板类的声明和实现放到.h文件里面

本文由CC原创总结,如需转载请注明出处:http://blog.csdn.net/oktears/article/details/27966399

&#8;输出结果如下图:

本文由CC原创总结,如需转载请注明出处:http://blog.csdn.net/oktears/article/details/27966399

时间: 2024-08-29 17:10:00

《数据结构、算法与应用》9.(C++实现顺序表)的相关文章

设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

转自: https://blog.csdn.net/cckevincyh/article/details/45605261 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性 先建立一个待插入的结点,然后依次与与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点. 算法如下: #include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 #define OK 1 #def

数据结构与算法学习 第1季01 顺序表 链表

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 顺序表:顺序存储结构的线性表.所谓顺序存储结构,就是指用一组连续地址的内存单元来存储整张线性表的存储结构.(因此按序遍历数据很方便,直接做指针偏移就可以了.) 常用操作 A)向顺序表中第i个位置插入元素item 1. 判断插入位置是否合法 2. 将i-1以后的元素后移一个元素的位置(注意静态顺序表和动态顺序表的差异)--- 从原来最后一个元素开始操作到原来的第i个元素,依次后移

数据结构第一次作业(学生信息管理系统-顺序表&amp;&amp;链表)

实验目的 : 1 .掌握线性表的定义: 2 .掌握线性表的基本操作,如建立.查找.插入和删除等. 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息: (2) 逐个显示学生表中所有学生的相关信息: (3) 根据姓名进行查找,返回此学生的学号和成绩: (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩): (5) 给定一个学生信息,插入到表中指定的位置: (6) 删除指定位置的学生记录: (7) 统计表中

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

经典数据结构实现与分析:顺序表,单链表,

本博客在在这里重新总结了一下,当前常用的经典数据结构:这里只针对链表,顺序表,简单树和图进行总结:具体实现请参考:https://github.com/yaowenxu/codes/tree/master/数据结构; 本文章,主要讨论数据结构的性质:以及对这些数据结构的性质:主要是用来知识整理与复习: 顺序表:顺序表是指,将元素顺序地存放在一块连续的内存中:元素间的顺序关系由他们的存储顺序自然表示:c++声明一个数组:int a[10]; 即构建了10个int内存大小(40bytes)的顺序表:

顺序表中的思路

在c语言当中判断数组的长度是比较麻烦的,不像其他语言可以通过对象的属性或者方法来获得长度. int arr[4]; int length = sizeof(arr)/sizeof(arr[0]); //数组占内存总空间,除以单个元素占内存空间大小 而有一种类似数组的数据结构叫线性表,可以用来很方便的获取数组的长度.其结构体为 typedef struct { int data[1024]; int last; } List; 该数据结构除了定义了一个长度为1024的数组外,还多定义一个变量las

顺序表中基本操作

前言:最近玩esp8266和ucos-iii以及在学c++比较多,接触的大部分都是指针.结构体.链表:刚好自己又在看数据结构(数据结构真的非常重要,要好好学,是学算法的敲门砖,哈哈哈),个人看法在对顺序表进行元素增和删操作,效率比较低(要移动非常多的其他元素),而我之前写的对链表操作,使用指针操作,效率就高多了.好了,来看今天的学习总结吧! 一.顺序表的初始化: 算法步骤: 1.为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址 2.将表的当前长度设为0 伪代码实现: S

顺序表应用举例

例一:将顺序表La=(a1,a2,a3,-..an)逆置. 解:要想将La逆置,只需要将第一个元素与最后一个交换,第二个和倒数第二个交换,以此类推,直到没有元素发生交换.算法描述如下: void contrary_Sq(SqList &la){ int temp; for(i=0;i<La.length/2;i++){ temp=La.elem[i]; La.elem[i]=La.elem[La.length-1-i]; La.elem[La.elem-1-i]=temp; } } 例二:设

顺序表与数组的区别和联系

顺序表是在计算机内存中以数组的形式保存的线性表. 顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表,顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中.线性表采用指针链接的方式存储就称之为链表. 线性表是从逻辑结构的角度来说的,除了头和尾之外,它的每一个元素都只有一个前驱元素和一个后驱元素.各种队列(单向.双向.循环队列),栈等都是线性表的不同例子. 而数组是从物理存贮的角度来说的,线性表可以用数组存贮也可以用链表来存贮.同

模板(顺序表与栈)

"顺序表与栈" 顺序表相对于我们来说已经不算是陌生的,顺序表有自己独有的特点,需要有一块独有的空间,访问中间的数据也较为简单,插入和删除数据就相对较难.针对顺序表的特点,我们不难想到一个数据结构"栈",栈的特点与顺序表相对来说很接近,栈的主要特点是"先进后出",即就是后进入栈的数据必须先出才能够访问到先前进入的数据,用顺序表来实现"栈"的一些基本功能更加合适. 这里首先提一下"模板"的概念,模板的一般形式为