线性表:数据结构基础全解析
线性表的基本概念
线性表是由相同数据类型的有限序列组成的线性结构。元素之间存在顺序关系,每个元素有且仅有一个前驱(除首元素)和一个后继(除尾元素)。线性表的逻辑结构可以表示为:
(a?, a?, ..., a?)
其中n为表长,当n=0时称为空表。
线性表的存储结构
顺序存储(顺序表)
使用连续的存储单元依次存放元素,逻辑相邻的元素物理位置也相邻。其特点包括:
- 随机访问时间复杂度O(1)
- 插入/删除平均需要移动n/2个元素
- 需要预分配固定空间
顺序表的结构通常定义为:
#define MAXSIZE 100
typedef struct {
ElemType data[MAXSIZE];
int length;
} SqList;
链式存储(链表)
通过指针域将元素链接起来,分为单链表、双链表和循环链表等。其特点包括:
- 动态分配空间,无需预知规模
- 插入/删除时间复杂度O(1)
- 访问元素需要顺序查找
单链表节点结构:
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
线性表的基本操作
初始化操作
顺序表初始化:
void InitList(SqList *L) {
L->length = 0;
}
链表初始化(带头节点):
void InitList(LinkList *L) {
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
插入操作
顺序表插入(在位置i插入e):
bool ListInsert(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1) return false;
if (L->length >= MAXSIZE) return false;
for (int j = L->length; j >= i; j--)
L->data[j] = L->data[j-1];
L->data[i-1] = e;
L->length++;
return true;
}
链表插入(在位置i插入e):
bool ListInsert(LinkList L, int i, ElemType e) {
LNode *p = L;
int j = 0;
while (p && j < i-1) {
p = p->next;
j++;
}
if (!p || j > i-1) return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
删除操作
顺序表删除(删除位置i的元素):
bool ListDelete(SqList *L, int i, ElemType *e) {
if (i < 1 || i > L->length) return false;
*e = L->data[i-1];
for (int j = i; j < L->length; j++)
L->data[j-1] = L->data[j];
L->length--;
return true;
}
链表删除(删除位置i的元素):
bool ListDelete(LinkList L, int i, ElemType *e) {
LNode *p = L;
int j = 0;
while (p->next && j < i-1) {
p = p->next;
j++;
}
if (!(p->next) || j > i-1) return false;
LNode *q = p->next;
*e = q->data;
p->next = q->next;
free(q);
return true;
}
查找操作
顺序表按值查找:
int LocateElem(SqList L, ElemType e) {
for (int i = 0; i < L.length; i++)
if (L.data[i] == e)
return i+1;
return 0;
}
链表按值查找:
LNode *LocateElem(LinkList L, ElemType e) {
LNode *p = L->next;
while (p && p->data != e)
p = p->next;
return p;
}
其他常用操作
获取表长:
int ListLength(SqList L) {
return L.length;
}
int ListLength(LinkList L) {
int count = 0;
LNode *p = L->next;
while (p) {
count++;
p = p->next;
}
return count;
}
判断空表:
bool ListEmpty(SqList L) {
return L.length == 0;
}
bool ListEmpty(LinkList L) {
return L->next == NULL;
}
线性表的应用场景
- 顺序表适合元素数量变化不大、频繁访问的场景
- 链表适合元素数量变化频繁、频繁插入删除的场景
- 具体应用包括:学生名单管理、多项式运算、文件目录管理等
性能分析
| 操作 | 顺序表 | 链表 | |------------|--------|------| | 访问元素 | O(1) | O(n) | | 插入/删除 | O(n) | O(1) | | 空间效率 | 静态 | 动态 | | 内存分配 | 连续 | 分散 |
5G.okacbd151.asia/PoSt/1123_070858.HtM
5G.okacbd152.asia/PoSt/1123_440796.HtM
5G.okacbd153.asia/PoSt/1123_590603.HtM
5G.okacbd154.asia/PoSt/1123_778829.HtM
5G.okacbd155.asia/PoSt/1123_316895.HtM
5G.okacbd156.asia/PoSt/1123_453559.HtM
5G.okacbd157.asia/PoSt/1123_312346.HtM
5G.okacbd158.asia/PoSt/1123_384271.HtM
5G.okacbd159.asia/PoSt/1123_935498.HtM
5G.okacbd160.asia/PoSt/1123_222036.HtM
5G.okacbd151.asia/PoSt/1123_646486.HtM
5G.okacbd152.asia/PoSt/1123_833689.HtM
5G.okacbd153.asia/PoSt/1123_205218.HtM
5G.okacbd154.asia/PoSt/1123_445112.HtM
5G.okacbd155.asia/PoSt/1123_460152.HtM
5G.okacbd156.asia/PoSt/1123_525662.HtM
5G.okacbd157.asia/PoSt/1123_113760.HtM
5G.okacbd158.asia/PoSt/1123_740240.HtM
5G.okacbd159.asia/PoSt/1123_121805.HtM
5G.okacbd160.asia/PoSt/1123_392056.HtM
5G.okacbd151.asia/PoSt/1123_789663.HtM
5G.okacbd152.asia/PoSt/1123_710342.HtM
5G.okacbd153.asia/PoSt/1123_351289.HtM
5G.okacbd154.asia/PoSt/1123_820178.HtM
5G.okacbd155.asia/PoSt/1123_286400.HtM
5G.okacbd156.asia/PoSt/1123_855376.HtM
5G.okacbd157.asia/PoSt/1123_085997.HtM
5G.okacbd158.asia/PoSt/1123_546407.HtM
5G.okacbd159.asia/PoSt/1123_584607.HtM
5G.okacbd160.asia/PoSt/1123_339797.HtM
5G.okacbd151.asia/PoSt/1123_283286.HtM
5G.okacbd152.asia/PoSt/1123_769474.HtM
5G.okacbd153.asia/PoSt/1123_845251.HtM
5G.okacbd154.asia/PoSt/1123_071340.HtM
5G.okacbd155.asia/PoSt/1123_833003.HtM
5G.okacbd156.asia/PoSt/1123_328198.HtM
5G.okacbd157.asia/PoSt/1123_109618.HtM
5G.okacbd158.asia/PoSt/1123_441338.HtM
5G.okacbd159.asia/PoSt/1123_680063.HtM
5G.okacbd160.asia/PoSt/1123_862189.HtM
5G.okacbd151.asia/PoSt/1123_834326.HtM
5G.okacbd152.asia/PoSt/1123_063465.HtM
5G.okacbd153.asia/PoSt/1123_632206.HtM
5G.okacbd154.asia/PoSt/1123_667407.HtM
5G.okacbd155.asia/PoSt/1123_250861.HtM
5G.okacbd156.asia/PoSt/1123_310476.HtM
5G.okacbd157.asia/PoSt/1123_153489.HtM
5G.okacbd158.asia/PoSt/1123_070768.HtM
5G.okacbd159.asia/PoSt/1123_804858.HtM
5G.okacbd160.asia/PoSt/1123_484419.HtM
5G.okacbd151.asia/PoSt/1123_804299.HtM
5G.okacbd152.asia/PoSt/1123_477517.HtM
5G.okacbd153.asia/PoSt/1123_003905.HtM
5G.okacbd154.asia/PoSt/1123_658490.HtM
5G.okacbd155.asia/PoSt/1123_527897.HtM
5G.okacbd156.asia/PoSt/1123_771572.HtM
5G.okacbd157.asia/PoSt/1123_475646.HtM
5G.okacbd158.asia/PoSt/1123_255740.HtM
5G.okacbd159.asia/PoSt/1123_955435.HtM
5G.okacbd160.asia/PoSt/1123_401000.HtM
5G.okacbd151.asia/PoSt/1123_372866.HtM
5G.okacbd152.asia/PoSt/1123_118103.HtM
5G.okacbd153.asia/PoSt/1123_367803.HtM
5G.okacbd154.asia/PoSt/1123_840565.HtM
5G.okacbd155.asia/PoSt/1123_784771.HtM
5G.okacbd156.asia/PoSt/1123_582972.HtM
5G.okacbd157.asia/PoSt/1123_935503.HtM
5G.okacbd158.asia/PoSt/1123_221918.HtM
5G.okacbd159.asia/PoSt/1123_591178.HtM
5G.okacbd160.asia/PoSt/1123_726839.HtM
5G.okacbd151.asia/PoSt/1123_317623.HtM
5G.okacbd152.asia/PoSt/1123_978384.HtM
5G.okacbd153.asia/PoSt/1123_347683.HtM
5G.okacbd154.asia/PoSt/1123_610245.HtM
5G.okacbd155.asia/PoSt/1123_073290.HtM
5G.okacbd156.asia/PoSt/1123_410339.HtM
5G.okacbd157.asia/PoSt/1123_202110.HtM
5G.okacbd158.asia/PoSt/1123_301979.HtM
5G.okacbd159.asia/PoSt/1123_297761.HtM
5G.okacbd160.asia/PoSt/1123_624738.HtM


