数据结构(4)——线性表的链式表示和实现

2.3.1 线性链表

  线性链表的链式存储结构的特定是用一组任意的存储单元存储线性表的数据元素(这组数据存储单元可以是连续的,也可以是不连续的)。

  节点包括:数据域和指针域
  只包含一个指针域的称为线性链表又称为单链表。

  单链表的主要操作代码如下:

#include<iostream>
#include<string>
using namespace std;

// 定义元素类型
typedef int ElemType;

// 定义线性表的单链表存储结构
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

// 功能: 获取第i个结点上的值
// 入参: L 带头结点的单链表
// 入参: i 位置i
// 入参: e 第i个位置上的值
// 返回: ERROR 没找到, OK 找到
string GetElemByIndex(LinkList L, int i, ElemType &e)
{
    // L为带头结点的单链表
    // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
    LinkList p = L->next;

    int j = 1;
    while(p && j < i)
    {
        p = p->next;
        j ++;
    }

    if (!p || j > i)
    {
        return "ERROR";
    }

    e = p ->data;
    return "OK";
}

// 功能: 在第 i 个位置前插入数值e
// 入参: L 单链表
// 入参: i 第i个位置
// 入参: e 要插入第i个位置的值
// 返回: OK 插入成功,ERROR 插入不成功
string InsertLinkList(LinkList &L, int i, ElemType e)
{
    // 带头结点的单链表
    LinkList p = L->next;
    int j = 1;

    // 寻找第 i - 1 个结点
    while(p && j < i - 1)
    {
        p = p->next;
        j ++;
    }

    if (!p || j > i - 1)
    {
        return "ERROR";
    }

    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return "OK";

}

// 功能: 删除带头结点单链表第i个位置上的值
// 入参: 带头结点的单链表
// 入参: i 第i个结点
// 返回: ERROR 删除不成功,OK 删除成功
string DelLinkList(LinkList &L, int i)
{
    LinkList p = L->next;
    int j = 1;
    while(p && j < i - 1)
    {
        p = p->next;
        j ++;
    }

    if (!p || j > i - 1)
    {
        return "ERROR";
    }

    LinkList q = p->next;
    p->next = q->next;
    free(q);
    return "OK";
}

// 功能: 创建一个单链表
// 入参: LinkList &L 单链表
// 入参: int n 单链表的长度
// 返回值: 空
void CreateLinkList(LinkList &L, int n)
{
    // 创建头结点
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    LinkList p;
    int i;
    for(i = 0; i <= n ; i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->data = i;
        p->next = L->next;
        L->next = p;
    }
}

// 功能: 遍历输出单链表
// 入参: 带头结点的单链表
// 返回值: 空
void Display(LinkList L)
{
    LinkList p = L->next;
    cout << "遍历单链表结果如下:" << endl;
    while(p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 主函数
void main()
{
    // 带头结点的单链表
    LinkList L;

    // 创建10个结点个数的单链表
    CreateLinkList(L, 10);

    // 遍历输出单链表
    Display(L);

    // 获取第i个位置上的元素
    ElemType e;
    string status = GetElemByIndex(L, 12, e);
    cout << status << "," << e << endl;

    // 在第 i 个位置之前插入数值e
    string insertStatus = InsertLinkList(L, 4, 90);
    cout << insertStatus << endl;
    Display(L);

    // 删除第i个位置上的结点
    string delStatus = DelLinkList(L, 5);
    cout << delStatus << endl;
    Display(L);
}
时间: 2024-10-28 15:37:39

数据结构(4)——线性表的链式表示和实现的相关文章

数据结构之线性表(链式存储结构)

线性表的实现分顺序存储结构和链式存储结构 上一节我们主要介绍了顺序存储结构,在最后我们还分别总结了顺序存储结构的优缺点, 对于顺序结构的缺点,我们有没有什么好的解决方法呢? 我们今天要介绍的线性表的链式存储结构就可以很好的解决顺序结构的缺点,一起来看. 顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么我们需要移动大量的元素,那产生这一问题的原因是什么呢? 仔细分析后,我们可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,我们在申请内存的的时候,是一次性申请一

【数据结构】-线性表的链式存储结构

引言:由于线性表的顺序存储结构在插入和删除时需要大量移动数据元素,从而引入线性表的链式存储结构. 线性表的链式存储结构:用一组任意的存储单元(可以连续也可以不连续)存储线性表的数据元素. 为了表示数据元素ai和其直接后继ai+1之间的逻辑关系,对ai来说,除了存储其本身的数据信息外,还需要存储其直接后继的存储位置.这两部分信息组成数据元素ai的存储映像(结点).它包含两个域:其中存储数据元素信息的域称为数据域:存储直接后继存储位置的域称为指针域. n个结点链接成一个链表,称为线性链表,由于此链表

数据结构_线性表_链式存储_双向循环链表的基本操作

//双向链表,将头结点和尾结点链接起来,就构成了双向循环链表 //双向循环链表是将头结点的前驱指针指向了尾结点,同时将尾结点的后劲指针指向了头结点. //空表,头结点的前驱和后继指针均指向了自己,这也是判断双向循环链表是否为空的条件, //双向循环链表具有对称性 //缺点,是要付出空间代价的 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 代

数据结构_线性表_链式存储_单向循环链表的基本操作

1.概述: 对于一个循环链表来说,其首节点和末节点被连接在一起.这种方式在单向和双向链表中皆可实现.要转换一个循环链表,可以选择开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点.再来看另一种方法,循环链表可以被视为"无头无尾".这种列表很利于节约数据存储缓存, 假定你在一个列表中有一个对象并且希望所有其他对象迭代在一个非特殊的排列下. 指向整个列表的指针可以被称作访问指针. 用单向链表构建的循环链表 循环链表中第一个节点之前就是最后一个节点,反之亦然.循环链表的无边界使得在这

数据结构------线性表的链式表示与实现

不多说直接上代码: #include"stdafx.h" #include <stdio.h> #include <stdlib.h> /****************************************************************************** /* 数据类型和常量定义 /***********************************************************************

数据结构-线性表的链式结构

线性表的链式结构,与之前说过的线性表的顺序结构差不多,区别在于存储结构和方式的不一样. 在链式中,来一个数据就去寻找一个空间存储一个结点有多少数据占多大的地方,是动态的存储方式.另外顺序表如果存储1MB就只占1MB存储空间,但是链式表不一样,它会有额外的空间去存储对应结点的指针. 这样一分析结构就出来了,链式结构为两部分:1.结点域.2.指针域.实现方法用动态存储. 1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typ

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构第三篇——线性表的链式存储之单链表

线性表的链式存储结构的特点是用一组任意的存储单元来存储线性表的数据元素,这些单元可以分散在内存中的任意位置上,其在物理上可以是连续的,也可以是不连续的.具有链式存储结构的线性表称为线性链表. 为了表示出每个数据元素与其后继之间的关系,除了存储数据元素本身的信息之外,还需存储指示其直接后继的信息.这可以用一个结点(node)来完整的表示. 将节点中存储数据元素本身信息的域称为数据域:存储其直接后继位置的域称为指针域.指针域中存储的信息称作指针或链. 一般情况下,链表中每个结点可以包含若干个数据域和

数据结构开发(5):线性表的链式存储结构

0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? 链式存储的定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息. 链式存储逻辑结构: 基于链式存储结构的线性表中,每个结点都包含数据域和指针域 数据域:存储数据元素本身 指针域:存储相邻结点的地址 专业术语的统一: 顺序表 基于顺序存储

数据结构--线性表的链式存储结构

一 线性表的链式存储结构 A.链式存储的定义为了表示每个数据元素与直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息图示B链式存储逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域1.数据域:存储数据元素本身2.指针域:存储相邻结点的地址图示C链表中的基本概念1.头结点--链表中的辅助结点,包含指向第一个数据元素的指针(方便插入和删除)2.数据结点--链表中代表数据元素的结点,表现形式为:(数据元素,地址)3.尾节点--链表中的最后一个数据结点,包