四、线性表(二)

接上篇线性表 (一)

四、线性表的物理结构--链式存储结构

4.1 定义

顺序存储结构的最大缺点就是插入和删除的时候需要移动大量元素,十分耗时。

链式存储结构中,不考虑所有元素的位置,只是让每个元素知道它下一个元素的位置在哪里,所有元素像一条绳子串起来的珠子,只是这些珠子的位置是散乱的。

这种结构下,我们可以在知道第一个元素时就知道第二个元素的内存地址,知道第二个元素时能找到第三个元素的地址......

以前在顺序存储中,每个数据元素只需要存储本身的元素信息就行了,而在链式存储结构中,除了存储本身的元素外还需要存储下一个元素的地址信息。我们把存储数据元素信息的域称为数据域,把存储后续位置的域称为指针域。这两部分信息组成数据元素a的存储映象,称为结点(Node)

n个结点链接成的一个链表即为线性表的链式存储结构,简称链表。因为这个链表的每个结点都只有一个指针域,所以称为单链表
单链表正是通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起的

链表中的第一个结点的存储位置称为头指针,整个链表的存取必须从头指针开始进行,最后一个指针指向,用Null或者^表示,如果图:

示意图

为了方便。我们会在单链表的第一个结点前设置一个结点,成为头结点。头结点的数据域可以不存储任何信息,也可以存储如线性表长度等附加信息,头结点的指针域存储指向第一个结点的指针:

示意图

4.2 头指针与头结点的异同

  • 头指针:
    1、头指针是指向链表第一个节点的指针,若链表有头节点,则是指向头结点的指针。
    2、头指针具有标识作用,所以常用头指针冠以链表的名字。
    3、无论链表是否为空,头指针均不为空,头指针是链表的必要元素。

  • 头结点:
    1、头结点是为了方便操作的统一而设立的,放在第一个元素的节点之前,其数据域无意义,也可以存储一些公共信息。
    2、有了头结点,对在于第一个元素结点前插入结点和删除结点,其操作就与其他结点的操作统一了。
    3、头结点不一定是链表必须要素。

4.3 代码描述

使用结构指针来描述单链表:

typedef stuck Node {
    ElemType data;
    stuck Node *next;
} Node;

//定义一个链表
typedef struct Node *LinkList;

五、单链表的常见操作

5.1 读取

算法思路:

  • 声明一个p指针指向链表第一个结点,初始化j从1开始
  • 当j<i时遍历链表,让p向后移动,j累加
  • 若链表末尾p为空则说明第i个结点不存在
  • 否则查找成功,返回p结点的数据

代码实现:

status GetElem(LinkList L, int i, ElemType *e) {
    int j = 1;
    LinkList p;
    p = L->next;
    while (j<i && p) {
        p = p -> next;
        j++;
    }
    if (!p || j>i) {
        return ERROR;
    }
    *e = p->data;
      return OK;
}

寻找链表中点
算法思想

  • 声明一个快指针,一个慢指针。
  • 块指针一次走一步,慢指针一次走两步。
  • 当快指针到达终点时,慢指针刚好在单链表的中点
  • 返回慢指针所指向的结点元素
status FindMidElem (LinkList L) {
    LinkList fastP = L->next->next;
    LinkList slowP = L->next;
    int j=1;
    while (j < L->length) {
        fastP = fastP->next->next;
        slowP = slowP->next;
    }
    return slowP->data;
}

查找元素的时间复杂度取决于i的位置,所以时间复杂度为O(n)。

5.2 单链表的插入

算法思路:

  • 先找到需要插入的位置:声明一个指向链表头的结点,初始化j为1;当j<i时,遍历链表,让p的指针向后移动,j累加1;若最后p指针为空则插入位置不存在,否则p就是所寻找的位置。
  • 在系统中生成一个空结点s;
  • 将元素e的数据赋值给s
  • 将p->next赋值给s->next,p->next为s

代码实现:

status insetElem(LinkList *L, int i, ElemType e) {
    LikList *p;
    LikList *p = GetElem(L, i, e);
    if (!e) { return ERROR; }
    s = (LinkList)malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

5.2 单链表的删除

算法思想:

  • 先找到需要插入的位置:声明一个指向链表头的结点,初始化j为1;当j<i时,遍历链表,让p的指针向后移动,j累加1;若最后p指针为空则插入位置不存在,否则p就是所寻找的位置。
  • 将欲删除的结点p->next赋值给q;
  • 将要删除的结点q中的元素赋值给e,作为返回值;
  • 释放q结点
  • 返回成功

代码实现:

status deleteElem(LinkList *L, int i, ElemType *e) {
    LinkList *p = GetElem(L,i,e);
    if (!e) { return ERROR; } 
    LinkList *q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    return OK;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容