线性表:数据结构基础全解析

线性表的基本概念

线性表是由相同数据类型的有限序列组成的线性结构。元素之间存在顺序关系,每个元素有且仅有一个前驱(除首元素)和一个后继(除尾元素)。线性表的逻辑结构可以表示为:

(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

#牛客AI配图神器#

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务