数据结构(1) -- 线性结构

1、顺序存储

//List.h
#ifndef LIST_H_
#define LIST_H_

#define MAXSIZE 100
typedef struct _Poly
{
    int a;
    int n;
    bool operator == (_Poly e)
    {
        if (a == e.a && n == e.n)
            return true;
        else
            return false;
    }
}Poly;

#define ElemType Poly

typedef struct _Node
{
    ElemType data[MAXSIZE];
    int last;
}Node;

class List
{
private:
    Node *data;
public:
    List();
    ~List();
    void Insert(ElemType e, int index);
    void Remove(int index);
    int Find(ElemType e);
    ElemType FindKth(int k);
    int Length();
};
#endif

//List.cpp
#include "List.h"
#include <iostream>

List::List()
{
    data = new Node();
    data->last = -1;
}

List::~List()
{
    delete data;
}

void List::Insert(ElemType e, int index)
{
    if (data->last == MAXSIZE - 1)
    {
        std::cout << "表满了" << std::endl;
        return;
    }
    if (index < 0 || index >(data->last + 1))
    {
        std::cout << "添加位置不合法" << std::endl;
        return;
    }
    for (int i = data->last; i >= index; i--)
    {
        data->data[i + 1] = data->data[i];
    }
    data->data[index] = e;
    data->last++;
}

void  List::Remove(int index)
{
    if (index < 0 || index > data->last)
    {
        std::cout << "删除位置不和法" << std::endl;
        return;
    }

    for (int i = index; i < data->last; i++)
    {
        data->data[i] = data->data[i + 1];
    }
    data->last--;
}

int  List::Find(ElemType e)
{
    for (int i = 0; i < data->last; i++)
    {
        if (data->data[i] == e)
            return i;
    }
    return -1;
}
ElemType  List::FindKth(int k)
{
    if (k < 0 || k > data->last)
    {
        std::cout << "查找位置不合法" << std::endl;
    }
    return data->data[k];
}
int  List::Length()
{
    return (data->last + 1);
}

2、链式存储

//PList.h
#ifndef PLIST_H_
#define PLIST_H_

#define MAXSIZE 100
typedef struct _Poly
{
    int a;
    int n;
    bool operator == (_Poly e)
    {
        if (a == e.a && n == e.n)
            return true;
        else
            return false;
    }
}Poly;

#define ElemType Poly

typedef struct _PNode
{
    ElemType data;
    _PNode* next;
}PNode;

class PList
{
private:
    PNode *head;
public:
    PList();
    ~PList();
    void Insert(ElemType e, int index);
    void Remove(int index);
    int Find(ElemType e);
    ElemType FindKth(int k);
    int Length();
};
#endif

//PList.cpp
#include "PList.h"
#include <iostream>

PList::PList()
{
    head = new PNode();
    head->next = NULL;
}

PList::~PList()
{
    delete head;
}

void PList::Insert(ElemType e, int index)
{
    PNode *p = head;
    PNode *s = new PNode();
    s->data = e;
    s->next = NULL;
    if (index > Length())
        std::cout << "插入位置错误" << std::endl;

    int i = 0;
    while (p && i < index)
    {
        p = p->next;
        i++;
    }
    s->next = p->next;
    p->next = s;
}

void  PList::Remove(int index)
{
    PNode *p = head;
    PNode *s = new PNode();
    if (index > Length())
        std::cout << "移除位置错误" << std::endl;

    int i = 0;
    while (p && i < index)
    {
        p = p->next;
        i++;
    }
    s = p->next;
    p->next = s->next;
    delete s;
}

int  PList::Find(ElemType e)
{
    PNode *p = head;
    int i = 0;
    while (p)
    {
        if (p->data == e)
            return i;
        i++;
        p = p->next;
    }
    return -1;
}
ElemType  PList::FindKth(int k)
{
    PNode *p = head;
    if (k < 0 || k > Length())
    {
        std::cout << "查找位置不合法" << std::endl;
    }
    int i = 0;
    while (p && i < k)
    {
        p = p->next;
        i++;
    }
    return p->next->data;
}
int  PList::Length()
{
    PNode *p = head;
    int i = 0;
    while (p)
    {
        i++;
        p = p->next;
    }
    return i;

}

3、测试用例

//main.cpp
#include <iostream>
#include <stdlib.h>
#include "PList.h"
using namespace std;

int main()
{
    PList L;
    for (int i = 0; i < 5; i++)
    {
        Poly t = { i, i };
        L.Insert(t, i);
    };
    cout << "last:" << L.Length() << endl;
    Poly e = { 2, 2 };
    cout << "Find return:" << L.Find(e) << endl;
    for (int i = 0; i < 4; i++)
    {
        cout << L.FindKth(i).a << "X" << L.FindKth(i).n  << " + ";
    }
    cout << L.FindKth(4).a << "X" << L.FindKth(4).n << endl;
    system("pause");
    return 0;
}
时间: 2024-10-15 21:37:48

数据结构(1) -- 线性结构的相关文章

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外

数据结构之线性结构

import java.util.*; class SLType{ public static void main(String args[]){ int i; SL sl = new SL(); DATA pdata; String key; System.out.println("the show of sequence list"); sl.SLlnit(sl); System.out.println("initialise sequence list is end&q

数据结构入门-线性结构

把所有的节点用一根直线串起来 连续存储[数组] 什么叫做数组:元素类型相同,大小相等 重点看代码吧,需要注意的都在注释里,多敲几遍,当然了,有些功能还没有实现,以后再实现 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 定义了一个数据类型,这个数据类型的名字叫做struct Arr,有三个成员 struct Arr { int * pBase; // 存储的是数组第一个元素的地址 int le

13. C#数据结构与算法 -- 线性结构

本文中,我们讨论了三个部分的内容: 什么是线性结构,线性结构有哪些特点 . 详细介绍了一个最简单线性结构顺序表,并且通过源代码进行一些的分析. 最后还举了一个例子,让我们更好的理解顺序表. 第一部分:什么是线性结构,线性结构有哪些特点 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素

Java数据结构之线性表(2)

从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的几张,我们将会分别讲解这几种数据结构,主要也是通过Java代码的方式来讲解相应的数据结构. 今天要讲解的是:Java线性结构 Java数据结构之线性结构 说到线性结构的话,我们可以根据其实现方式分为两类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表 对于1)和2)的讲解,请参考

Java数据结构之线性表

从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的几张,我们将会分别讲解这几种数据结构,主要也是通过Java代码的方式来讲解相应的数据结构. 今天要讲解的是:Java线性结构 Java数据结构之线性结构 说到线性结构的话,我们可以根据其实现方式分为三类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表 1.顺序结构的线性表    

常见的线性结构

目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现"括号匹配"问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言 ??本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间

Mooc数据结构-基础和线性结构

1 数据结构 解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的操作相关联 完成这些操作所用的方法就是算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象: 描述数据类型的方法不依赖与具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言无关

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个