数据结构与算法之线性表
1.线性表是n个具有相同特性的数据元素的有限序列。
线性表的主要物理存储结构有两种:
- 顺序存储结构——顺序表
- 链式存储结构——线性链表
2.顺序表
顺序存储:存储线性表最简单、最常用的方式是——在内存中开辟一段连续的存储空间,用一组连续的存储单元依次存放数据元素。(数组)
顺序存储的特点:在逻辑上相邻的数据元素,其物理位置也是相邻的。
顺序存储的优缺点:
优——存取方便;简单直观;
缺——插入删除结点困难;扩展不灵活;容易造成浪费;
c语言的定义实现:
#define Maxsize 100//线性表的最大数据元素数目
typedef int elemtype;
typedef struct
{
elemtype v[Maxsize];//存放线性表元素的数组
int len;//线性表长度
}sqlist;
基于c++的实现:
List.h
class List
{
public:
List(int size);
~List();
void ClearList();
bool ListEmpty();
int ListLength();
bool GetElem(int i, int *e);//获取位序为i的元素
int LocateElem(int *e); //获取第一个满足e的元素的位序
bool PriorElem(int *currentElem, int *preElem);//找出给定元素的前驱
bool NextElem(int *currentElem, int *nextElem);//找出给定元素的后继
bool ListInsert(int i, int *e);//第i个位置插入元素
bool ListDelete(int i, int *e);//删除第i个元素
void ListTraverse();//遍历
private:
int *m_pList;//指向顺序表的首地址
int m_iSize;
int m_iLen;
};
List.cpp
#include<iostream>
#include"list.h"
using namespace std;
List::List(int size)
{
m_iSize = size;
m_pList = new int[m_iSize];
m_iLen = 0;
}
List::~List()
{
delete m_pList;
m_pList = NULL;
}
void List::ClearList()
{
m_iLen = 0;
}
bool List::ListEmpty()
{
return m_iLen == 0 ? true : false;
}
int List::ListLength()
{
return m_iLen;
}
bool List::GetElem(int i, int *e)
{
if (i < 0 || i >= m_iLen)
return false;
*e = *(m_pList + i);
return true;
}
int List::LocateElem(int *e)
{
for (int i = 0; i < m_iLen; 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 true;
}
*preElem = *(m_pList + temp - 1);
return true;
}
}
bool List::NextElem(int *currentElem, int *nextElem)
{
int temp = LocateElem(currentElem);
if (temp == -1)
{
return false;
}
else
{
if (temp == (m_iLen-1))
{
return true;
}
*nextElem = *(m_pList + temp + 1);
return true;
}
}
bool List::ListInsert(int i, int *e)
{
if (i<0 || i>m_iLen)
return false;
for (int j = m_iLen - 1; j >= i; j--)
{
*(m_pList + j + 1) = *(m_pList + j);
}
*(m_pList + i) = *e;
m_iLen++;
return true;
}
bool List::ListDelete(int i, int *e)
{
if (i<0 || i>= m_iLen)
return false;
*e = *(m_pList + i);
for (int j = i + 1; j < m_iLen; j++)
{
*(m_pList + j - 1) = *(m_pList + j);
}
m_iLen--;
return true;
}
void List::ListTraverse()
{
for (int i = 0; i < m_iLen; i++)
{
cout << *(m_pList + i) << " ";
}
}
main.cpp
#include<iostream>
#include"list.h"
int main(void)
{
//3 5 7 2 9 1 8
/*int e0 = 3;
int e1 = 5;
int e2 = 7;
int e3 = 2;
int a;
List *l = new List(10);
l->ListInsert(0, &e0);
l->ListInsert(1, &e1);
l->ListInsert(2, &e2);
l->ListInsert(3, &e3);
l->ListTraverse();
l->ListDelete(2, &a);
l->ListTraverse();
delete l;
l = NULL;测试*/
system("pause");
return 0;
}
3.链表
接下文:https://blog.csdn.net/weixin_43217963/article/details/88756593