一:什么是线性表
线性表顾名思义是具有像线一样的性质的表。即线性表是零个或多个数据元素的有限序列。
线性表的数学定义如下:若将线性表记(a1,a2,a3.…,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当ai不是最后一个元素时,ai有且仅有一个直接后继,当ai不是第一个元素时,ai有且仅有一个直接前驱。
当线性表元素为零时,称为空表。
二.线性表的顺序存储结构
- 顺序线性表的地址计算方法:
LOC(ai+1)=LOC(ai)+c,其中c为该数据类型所占用的存储单元
- 线性表的插入操作
void Listinsert(Sqlist *L,int i,Elemtype e)
{
int k;
if(L->length==maxsize) //顺序线性表已满
{
printf("error!");
return;
}
if(i<1||i>L->length+1)//i不在范围内
{
printf("error!");
return;
}
if(i<=L->length)//若插入元素不在末尾
{
for(k=L->length-1;k>=i-1;k--)//将要插入位置后的元素集体向后移动一位
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
L->length++;
return;
}
- 线性表的删除操作
void ListDelete(Sqlist *L,int i,Elemtype e)
{
int k;
if(L->length==0) //线性表为空
{
printf("error!");
return;
}
if(i<1||i>L->length+1)//i不在范围内
{
printf("error!");
return;
}
*e=L->data[i-1];
if(i<L->length)//若删除元素不是最后一个元素
{
for(k=i;k<L->length;k++)//将删除元素的后继元素前移
L->data[k-1]=L->data[k];
}
L->length--;
return;
}
- 线性表的顺序存储结构的优点与缺点:
- 优点
可以快速地存取表中任一位置的元素 - 缺点
插入与删除操作需要移动大量元素
存储空间确定,当长度变化过大时可能导致存储空间不够
三:线性表的链式存储结构
-
线性表链式存储结构的定义
对任意数据元素ai,其除了存储本身的信息外,还需要存储其直接后继元素的位置(即地址)。我们把存储数据元素信息的域称为数据域,把存储直接后继元素位置的域称为指针域。这两部分信息组成的数据元素ai的存储映像,称为结点(Node)。n个结点链结成一个链表,即为性线表的链式存储结构。 -
单链表
若链表中的每个结点中只包含一个指针域,则称为单链表。
其基本结构为:
typedef struct Node
{
ElemType data;//数据域
strcut Node;//指针域
}Node;
typedef struct Node *LinkList;//定义一个链表
假设p是指向第i个元素的指针,则该结点ai的数据域可以用p->data来表示,ai+1的数据域可以用p->next->data表示(如图所示)
- 单链表的基本操作
可以参考我的上一篇博客,这里就不细讲了
单链表操作操作汇总 - 单链表结构与顺序存储结构优缺点
1.时间性能
- 查找:
- 顺序存储结构O(1)
- 单链表O(n)
- 插入与删除:
- 顺序存储结构O(n)
- 单链表O(1)
2.空间性能
-
顺序存储结构需要预分配存储空间,分大了浪费空间分小了容易发生上溢。
-
单链表不需要分配存储空间,只要电脑有剩余空间就能用,元素个数也不受限制。