顺序表和单链表的对比分析

问题:
如何判断某个数据元素是否存在于线性表中?

for(int i=0; i<list.length(); i++)
{
    if(list.get(i) == v)
    {
        cout << "find it" <<endl;
    }
}

遗失的操作——find
-可以为线性表(List)增加一个查找操作
-int find(const T& e) const;

  参数:
  待查找的数据元素
  返回值:
  >=0: 数据元素在线性表中第一次出现的位置
  -1:数据元素不存在

在List.h中新增一个纯虚函数:

virtual int find(const T& e) const = 0;

因为LinkList.h和SeqList.h是List.h的子类,因此需要在LinkList.h和SeqList.h中将find纯虚函数实现:

LinkList.h

int find(const T& e)const
    {
        int ret = -1;
        int i=0;
        Node* node = m_header.next;
        while(node)
        {
            if(node->value == e)
            {
                ret = i;
                break;
            }
            else
            {
                node = node->next;
                i++;
            }
        }

        return ret;
    }

SeqList.h

 int find(const T& e) const
    {
        int ret = -1;
        for(int i=0; i<m_length; i++)
        {
            if(m_array[i] == v)
            {
                ret = i;
                break;
            }
        }
        return ret;
    }

测试:

(1)基本类型的测试

LinkList<int> list;

    for(int i=0; i<5; i++)
    {
        list.insert(0,i);
    }

    cout << list.find(5) << endl;

基本类型的测试是OK的

(2)自定义类类型的测试

在main.cpp中添加下面的代码:

class Test
{
int i;
public:
    Test(int v=0)
    {
        i = v;
    }
};

int main()
{
    Test t1(1);
    Test t2(2);
    Test t3(3);

    LinkList<Test> list;

    return 0;

}

进行编译,会出现如下错误:

比较两个Test对象是否相等,并没有重载相等操作符。

暂且做一件没有意义的事,只是让代码编译过去。

class Test
{
int i;
public:
    Test(int v=0)
    {
        i = v;
    }
    bool operator == (const Test& e)
    {
        return true;
    }
};

这样虽然可以编译通过,但是这样做不好,不值得推荐。

我们可以在顶层的父类中实现相等和不相等操作符的重载函数

Object.h

  bool operator == (const Object& obj);
  bool operator != (const Object& obj);

Object.cpp

bool Object::operator ==(const Object& obj)
{
    return (this == &obj);  //比较地址是最好的选择
}

bool Object::operator !=(const Object& obj)
{
    return (this != &obj);
}

在main.cpp中:

class Test : public Object  //将自定义类继承于Object,是为了避免编译错误。
{
int i;
public:
    Test(int v=0)
    {
        i = v;
    }

    bool operator ==(const Test& e)  //判断两个对象的依据是判断对象的成员变量i是否相等,需要重新实现operator ==()函数
    {
        return (i == e.i);
    }

};

int main()
{
    Test t1(1);
    Test t2(2);
    Test t3(3);

    LinkList<Test> list;

    list.insert(t1);
    list.insert(t2);
    list.insert(t3);

    cout << list.find(t2) <<endl;

    return 0;

}

从这个表中可以看出,单链表的时间复杂度相比顺序表没有什么优势,反而更差,那么忙工程中为什么单链表会使用的比较多呢?

有趣的问题:
顺序表的整体时间复杂度比单链表要低,那么单链表还有使用价值吗?

原文地址:https://www.cnblogs.com/-glb/p/12142785.html

时间: 2024-11-05 22:33:19

顺序表和单链表的对比分析的相关文章

九、顺序表和单链表的对比分析

1.如何判断某个数据元素是否存在于线性表中? find()操作: 可以为线性表List增加一个查找操作 int find(const T& e)const; 参数:待查找的数据元素 返回值: 大于0:数据元素在线性表中第一次出现的位置 -1:数据元素不存在 针对基础数据类型,首先在顶层父类List中增加一个虚函数virtual int find(const T& e) const = 0;,然后在各子类中实现这个函数 // 顺序表中的实现 SeqList.h int find(const

线性表的链式存储——顺序表和单链表的对比分析

1,线性表两种实现: 1,顺序表: 2,单链表: 2,问题: 1,如何判断某个数据元素是否存在线性表中? 1,遍历线性表: 2,封装这个遍历操作: 3,遗失的操作 - find: 1,可以为线性表(List)增加一个查找操作: 2,int find(const T& e) const; 1,参数: 1,待查找的数据元素: 2,返回值: 1,>= 0:数据元素在线性表中第一次出现的位置: 2,-1:数据元素不存在: 3,遍历中会有相等和不等操作符,当比较对象是类的时候,需要类继承自 Objec

第二十三课 顺序表和单链表的对比分析

问题: 如何判断某个数据元素是否存在于线性表中? 查找一个元素是否在线性表中,每次查找就需要使用for循环,因此,我们需要封装一个find成员函数. 在List.h中添加find函数: SeqList.h中添加find的实现: LinkList.h中添加find的实现: 测试程序如下: 1 #include <iostream> 2 #include "LinkList.h" 3 4 5 using namespace std; 6 using namespace DTLi

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

顺序表与单链表

初学数据结构,对顺序表与单链表的概念与操作有点模模糊糊,为此特地查阅了资料,了解了不少,以下是对他们的总结: 顺序表内存中地址连续,长度不变更,支持随机查找,可以在时间复杂度O(1)内查找元素,适用于大量访问元素而少量增添或删除的程序.链表内存地址非连续,长度可以变化,算法时间复杂度为O(n),适用于需要进行大量增添或删除元素操作,而对访问无需求的程序. 下面来看看他们的基本操作(查找,删除,插入)的区别: 顺序表的查找: int GetElem(Seqlist L,int i,DateType

顺序表与单链表的区别及优缺点

线性表之顺序表与单链表的区别及优缺点 尊重原创 -->原文链接 --> 侵权删 这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 顺序表描述: 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素占用存储单元的长度. 单链表描述: 单链表

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

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

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