线性表2

120 阅读2分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。

线性表的链式存储结构定义:

我们将存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。
指针域中的存储信息叫做指针或链,这两部分信息组成数据元素的存储映像称为结点。
    n个结点链结成一个链表,即为线性表的链式存储结构,因为次链表的每一个结点中只包含一个指针域,所以称为单链表
链表中第一个结点的存储位置称为头指针。
单链表的第一个结点设一个结点称为头结点。

头指针和头结点的区别:

头指针:
    链表必要元素
    是链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。
    有标识作用,所以常用头指针描述链表名字。
    无论链表是否为空,头指针均不为空。
头结点:
    非链表必要元素
    为操作统一和方便,放在第一元素的结点之前,其数据域一般无意义。
    可存放链表长度。

线性表的结构定义:

typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

结点由存放 数据元素的数据域存放后继结点地址的指针域 组成。

单链表的读取:

获得链表第i个数据的算法思路:
1.声明一个指针h指向链表第一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让h的指针向后移动,不断指向下一个节点,j累加13.若到链表末尾h为空,则第i个结点不存在,否则查找成功。
4.返回结点h的数据。
Status GetElem (LinkList L,int i,ElemType *e)
{
    int j;
    LinkList p;
    p = L->next;
    j = 1;
    while(p && j<i)
    {
        p = p->next;
        ++j;
    }
    if( !p || j>i)
        return 0;
     *e = p->data;
     return 1;
}
其实就是从头开始找,直到第i个结点为止,该算法是时间复杂度为O(n)。主要核心思想就是工作指针后移。
单链表也有插入和删除,但跟顺序结构略有不同。
对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。

单链表整表创建的算法思路:

1.声明指针p和计数器变量i2.初始化一空链表L;
3.让L的头结点指向NULL,即建立一个带头结点的单链表;
4.循环:
  • 生成一新结点赋值给p;
  • 生成一随机数赋值给p->data;
  • 将p插入到头结点与前一新结点之间。

单链表整表删除的算法思路:

1.声明一结点pq2.将第一个结点赋值给p3.循环:
  • 将下一节点赋值给q;
  • 释放p;
  • 将q赋值给p。