1.线性表的概念
线性表的存储结构有顺序存储结构和链式存储结构两种。前者成为顺序表,后者称为链表。
- 顺序表:
顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示。
- 链表
在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下图所示。
本文中以单链表为例。
2.线性表的比较
顺序表和链表各自有各自的优点和缺点,可以用下表表示:
比较类别 | 顺序表 | 链表 |
---|---|---|
存储分配 | 静态分配 | 动态分配 |
存取方式 | 随机存取 | 顺序存取 |
插入删除时移动元素的个数 | 需要移动近一半的元素 | 不需要移动元素,只需修改指针 |
由此可见,当需要随机存取的时候,适合使用顺序表;当需要做频繁插入删除操作时,适合使用链表。
3.线性表的数据结构
- 顺序表
typedef struct
{
T data[maxSize];
int length;
}Sqlist;
结构体中包括一个存储表元素数组data[]和指示元素个数的变量length。(其实顺序表就是数组)。
- 链表
单链表的节点定义:
template<class T>
struct Node
{
T value;
struct Node* next;
};
4.顺序表的算法操作
- 顺序表的算法操作:
下面是我写的比较中重要的顺序表的算法操作。
#define maxSize 1000
#include <iostream>
using namespace std;
//注意模板必须用class
template<class T>
class Sqlist
{
private:
T data[maxSize];
int length;
public:
Sqlist()
{
length = 0;
}
Sqlist(T *A,int size)
{
for (int i = 0; i < size;i++)
{
data[i] = A[i];
}
length = size;
}
T at(int loc); //loc为数组中位置,以0开始
void insert(int loc, T value);
void display();
void push_back(T);
T erase(int loc); //loc为数组中位置,以0开始
};
template<class T>
T Sqlist<T>::erase(int loc)
{
int i = 0;
T x = data[loc];
for (i = loc; i < length; i++) //对于临界点的数,可以试着把临界点带进去
{
data[i] = data[i + 1];
}
length--;
return x;
}
template<class T>