1.线性表顺序存储结构的优点:一是无需为元素之间的逻辑关系而增加额外的存储空间;二是可以迅速的取表中任意位置的元素。其缺点为:一是插入和删除需要移动大量的元素;二是线性表需要固定的存储空间,不适用于线性表长度变化较大的场合,也就是不灵活;三是有存储空间的碎片;(其实,动态数组在一定程度上可以避免此类情况的发生,比如STL中的std::vector)
2. 线性表的链式存储结构:
不仅要存储数据的信息,还要存储元素之间的逻辑关系,也即是后继元素的地址或者是前继元素的地址;
有了头结点,对第一元素的插入和删除的操作就与其余结点的操作统一了;
头指针指向链表的第一个结点。若链表有头结点,则指向它;
其C语言实现为
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef Node *LinkList;
3.单链表的读取:
bool GetEle(LinkList L,int i,ElemType *e)
{
int j=1;
LinkList p=L->next; //p指向第一个元素的位置
while(p && j<i)
{
p=p->next;
j++;
}
if(!p || j>i)
{ return false;}
*e=p->data;
return true;
}
4.单链表的删除;
bool ListDelete(LinkList L,int i,ElemType *e) //删除链表中第i个元素,并用e 返回其值,L的长度减1;
{
int j=1;
LinkList p=L->next; //p指向第一个结点
while (p->next && j<i) //遍历寻找第i个元素
{
p=p->next;
++j;
}
if (!p->next || j>i) //第i个元素不存在
{
return false;
}
*e=p->next->data;
LinkList q=p->next; //q指向第i个元素;
p->next=q->next; //使第i个元素的前继指向其后继
free(q); //释放第i个元素的内存
return true;
}
5.单链表的结构优点:不需要预先分配存储空间,元素个数也不受限制;并且其在找到元素位置后,插入和删除操作的复杂度为O(1);缺点是查找速度没有顺序存储的快;
6.循环链表
7.双向链表