数据结构探险之线性表篇(上):顺序表

数据结构探险之线性表篇

将要学到得:

  • 线性表(链表)

什么是线性表?

线性表是n个数据元素的有限序列

线性表

排列之后成线性展开。

有限 & 数据元素(简单 & 复杂) & 序列

线性表的分类:

线性表的分类
  • 数组:访问速度快,搜索能力强。与内存地址相关
  • 链表 & 线性链表 & 线性表的链式表达

链字:重要。

应用场景:通讯录。加,删,搜索。

一元多项式:

一元多项式

只有x一个变量x。一元。p0~pn为系数。多项。

线性表编码

前驱后继。前一个元素 & 后一个元素

要求:

线性表要求
  • 在第i个位置插入元素。那么后面的所有都要后移
  • 在第i个位置删除元素。那么后面的所有都要前移
//list.h
#ifndef LIST_H
#define LIST_H
class List
{
public:
    List(int size);
    ~List();
    void CleanList();
    bool ListEmpty();
    int ListLength();
    bool GetElem(int i, int *e);
    int LocateElem(int *e);
    bool PriorElem( int *currentElem,int *preElem);
    bool NextElem(int *currentElem, int *nextElem);
    void ListTraverse();
    bool ListInsert(int i ,int *e);
    bool ListDelete(int i ,int *e);
private:
    int *m_pList;
    int m_iSize;
    int m_iLength;
};

#endif

//list.cpp:
#include "List.h"
#include <iostream>
using namespace std;

List::List(int size)
{
    m_iSize = size;
    m_pList = new int[m_iSize];
    m_iLength = 0;
}

List::~List()
{
    delete []m_pList;
    m_pList = NULL;
}
void List::CleanList()
{
    m_iLength = 0;
}
bool List::ListEmpty()
{
    if (m_iLength == 0)
    {
        return true;
    } 
    else
    {
        return false;
    }
}

int List::ListLength()
{
    return m_iLength;
}
bool List::GetElem(int i, int *e)
{
    if (i<0 || i >= m_iSize)
    {
        return false;
    }
    *e = m_pList[i];
    return true;
}

int List::LocateElem(int *e)
{
    for(int i=0;i<m_iLength;i++)
    {
        if (m_pList[i] == *e)
        {
            return i;
        }
    }
    return -1;
}
bool List::PriorElem(int *currentElem, int *preElem)
{
    int temp = LocateElem(currentElem);
    if (temp == -1 )
    {
        return false;
    }
    else
    {
        if (temp == 0)
        {
            return false;
        }
        else
        {
        *preElem = m_pList[--temp];
        return true;
        }
    }

}

bool List::NextElem(int *currentElem, int *nextElem)
{
    int temp = LocateElem(currentElem);
    if (temp == -1)
    {
        return false;
    }
    else
    {
        if (temp == --m_iLength)
        {
            return false;
        }
        else
        {
            *nextElem = m_pList[++temp];
            return true;
        }
    }
}
void List::ListTraverse()
{
    for (int i=0;i<m_iLength;i++)
    {
        cout << m_pList[i] << endl;
    }
}
bool List::ListInsert(int i, int *e)
{
    if (i<0 || i > m_iSize)
    {
        return false;
    }
    //先把i及之后的先移动
    //for (int k = i;k<m_iLength;k++)//这样会导致覆盖掉
    for (int k = m_iLength; k>=i; k--)
    {
        m_pList[k + 1] = m_pList[k];
    }
    m_pList[i] = *e;

    m_iLength++;

    return true;
}
//先删除再移动相应的元素(从i+1个逐次往前移)
bool List::ListDelete(int i, int *e)
{
    if (i<0 || i >=m_iSize)
    {
        return false;
    }
    *e = m_pList[i];
    for (int k =i+1;k<m_iLength;k++)
    {
        m_pList[k-1] = m_pList[k];
    }
    
    m_iLength--;
    return true;
}

//main.cpp:

#include "List.h"
#include <iostream>
using namespace std;
#include <stdlib.h>
//BOOL InitList(List **list);//创建线性表
//
//void DestroyList(List *list);//销毁线性表
//
//void CleanList(List *list);//清空线性表
//
//BOOL ListEmpty(List *list);//判断线性表是否是空
//
//int ListLength(List *list);//获取线性表长度
//
//BOOL GetElem(List *list, int i, Elem *e);//获取指定元素
//int LocateElem(List *list, Elem *e);//寻找第一个满足e的数据元素的位序
//BOOL PriorElem(List *list, Elem *currentElem, Elem *preElem);//寻找指定元素的前驱
//BOOL NextElem(List *list, Elem *currentElem, Elem *nextElem);//获取指定元素的后继
//BOOL ListInsert(List *list,int i, Elem *e);//在第i个位置插入元素
//BOOL ListDelete(List *list, int i, Elem *e); //删除第i个位置元素
//void ListTraverse(List *list); //遍历线性表

int main()
{
    //3 5 7 2 9 1 8
    int e1 = 3;
    int e2 = 5;
    int e3 = 7;
    int e4 = 2;
    int e5 = 9;
    int e6 = 1;
    int e7 = 8;
    int temp = 0;
    List *list1 = new List(10);
    cout <<"length:"<<list1->ListLength()<<endl;
    list1->ListInsert(0, &e1);
    cout << "length:" << list1->ListLength() << endl;
    list1->ListInsert(1, &e2);
    list1->ListInsert(2, &e3);
    list1->ListInsert(3, &e4);
    list1->ListInsert(4, &e5);
    list1->ListInsert(5, &e6);
    list1->ListInsert(6, &e7);
    /*list1->ListDelete(0, &temp);
    if (!list1->ListEmpty())
    {
        cout << "not empty" << endl;
    }
    list1->CleanList();
    if (list1->ListEmpty())
    {
        cout << "empty" << endl;
    }
    list1->ListTraverse();
    cout << "#" << temp << endl;*/
    
    list1->ListTraverse();

    list1->GetElem(0, &temp);
    cout << "temp:" << temp << endl;
    temp = 5;
    cout << "index:"<<list1->LocateElem(&temp) << endl;;

    list1->PriorElem(&e4, &temp);
    cout << "proior:" << temp << endl;
    list1->NextElem(&e4, &temp);
    cout << "next:" << temp << endl;

    delete list1;

    system("pause");
    return 0;
}

运行结果:

运行结果
升级版(int 升级对象元素)
//list.h
#ifndef LIST_H
#define LIST_H

#include "Coordiante.h"

class List
{
public:
    List(int size);
    ~List();
    void CleanList();
    bool ListEmpty();
    int ListLength();
    bool GetElem(int i, Coordinate *e);
    int LocateElem(Coordinate *e);
    bool PriorElem(Coordinate *currentElem, Coordinate *preElem);
    bool NextElem(Coordinate *currentElem, Coordinate *nextElem);
    void ListTraverse();
    bool ListInsert(int i , Coordinate *e);
    bool ListDelete(int i , Coordinate *e);
private:
    Coordinate *m_pList;
    int m_iSize;
    int m_iLength;
};

#endif

//list.cpp:
#include "List.h"
#include <iostream>
using namespace std;

List::List(int size)
{
    m_iSize = size;
    m_pList = new Coordinate[m_iSize];
    m_iLength = 0;
}

List::~List()
{
    delete []m_pList;
    m_pList = NULL;
}
void List::CleanList()
{
    m_iLength = 0;
}
bool List::ListEmpty()
{
    if (m_iLength == 0)
    {
        return true;
    } 
    else
    {
        return false;
    }
}

int List::ListLength()
{
    return m_iLength;
}
bool List::GetElem(int i, Coordinate *e)
{
    if (i<0 || i >= m_iSize)
    {
        return false;
    }
    *e = m_pList[i];
    return true;
}

int List::LocateElem(Coordinate *e)
{
    for(int i=0;i<m_iLength;i++)
    {
        if (m_pList[i] == *e)
        {
            return i;
        }
    }
    return -1;
}
bool List::PriorElem(Coordinate *currentElem, Coordinate *preElem)
{
    int temp = LocateElem(currentElem);
    if (temp == -1 )
    {
        return false;
    }
    else
    {
        if (temp == 0)
        {
            return false;
        }
        else
        {
        *preElem = m_pList[--temp];
        return true;
        }
    }

}

bool List::NextElem(Coordinate *currentElem, Coordinate *nextElem)
{
    int temp = LocateElem(currentElem);
    if (temp == -1)
    {
        return false;
    }
    else
    {
        if (temp == --m_iLength)
        {
            return false;
        }
        else
        {
            *nextElem = m_pList[++temp];
            return true;
        }
    }
}
void List::ListTraverse()
{
    for (int i=0;i<m_iLength;i++)
    {
        cout << m_pList[i] << endl;//已经完成了输出运算符重载
        //m_pList->printCoordinate();
    }
}
bool List::ListInsert(int i, Coordinate *e)
{
    if (i<0 || i > m_iSize)
    {
        return false;
    }
    //先把i及之后的先移动
    //for (int k = i;k<m_iLength;k++)//这样会导致覆盖掉
    for (int k = m_iLength; k>=i; k--)
    {
        m_pList[k + 1] = m_pList[k];
    }
    m_pList[i] = *e;

    m_iLength++;

    return true;
}
//先删除再移动相应的元素(从i+1个逐次往前移)
bool List::ListDelete(int i, Coordinate *e)
{
    if (i<0 || i >=m_iSize)
    {
        return false;
    }
    *e = m_pList[i];
    for (int k =i+1;k<m_iLength;k++)
    {
        m_pList[k-1] = m_pList[k];
    }
    
    m_iLength--;
    return true;
}

//Coordinate.h
#ifndef COORDINATE_H
#define COORDINATE_H
#include <ostream>
using namespace std;
class Coordinate
{
    friend ostream &operator<<(ostream &out, Coordinate &coor);
public:
    Coordinate(int x = 0, int y = 0);
    void printCoordinate();
    bool operator==(Coordinate &coor);
private:
    int m_iX;
    int m_iY;
};
#endif

//Coordinate.cpp
#include "Coordiante.h"
#include <iostream>
using namespace std;

Coordinate::Coordinate(int x, int y)
{
    m_iX = x;
    m_iY = y;
}
void Coordinate::printCoordinate()
{
    cout << "(" << m_iX << "," << m_iY << ")" << endl;
}

ostream &operator<<(ostream &out, Coordinate &coor)
{
    out << "(" << coor.m_iX << "," << coor.m_iY << ")" << endl;
    return out;
}
bool Coordinate::operator==(Coordinate &coor)
{
    if(this->m_iX == coor.m_iX && this->m_iY == coor.m_iY)
    {
        return true;
    }
    else
    {
        return false;
    }
}

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

int main()
{
    //3 5 7 2 9 1 8
    Coordinate e1(3,5);
    Coordinate e2(5,7);
    Coordinate e3(6,8);
    Coordinate temp(0,0);
    List *list1 = new List(10);
    cout <<"length:"<<list1->ListLength()<<endl;
    list1->ListInsert(0, &e1);
    cout << "length:" << list1->ListLength() << endl;
    list1->ListInsert(1, &e2);
    list1->ListInsert(2, &e3);
    list1->ListTraverse();
    delete list1;

    system("pause");
    return 0;
}

运行结果:

运行结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值