首页 > 其他分享 >线性表的链式存储结构

线性表的链式存储结构

时间:2023-06-01 19:11:13浏览次数:21  
标签:存储 线性表 指向 int next 链式 NULL 节点 指针

线性表的链式存储结构

标签(空格分隔): DS 线性表 链式存储


1.线性表的单链表存储结构

typedef struct Node
{
    ElemType data;//数据域
    struct Node *next;//指针域
}Node,* pNode;//节点,节点指针
typedef struct Node* LinkList;//头指针指向头节点

2.单链表的读取第i个元素

思路:
1.声明一个指针p指向第一个节点
2.遍历链表,让p不断指向下一个节点直到指向第i个节点
3.若到链表尾都没有指向第i个元素,p=NULL,则说明第i个元素不存在,找不到
4.若找到,返回p的数据
Status GetElem(LinkList L, int i, ElemType *e)
{
    pNode p;//声明指向指针
    p=L->next;//指向第一个节点
    
    int j=1;//j为计数器,统计指向第几个节点
    while(p!=NULL&&j<i)
    {
        p=p->next;
        ++j;
    }
    
    if(!p||j>i)
    return ERROR;//没找着
    
    *e=p->data;//找着了
    return OK;
}

3.单链表在第i个节点后插入

思路:
1.首先要找到第i个节点(参考单链表的读取)
    1.1如果找到了,生成一个空节点s,将要插入的元素e赋值给s->data,然后把节点s插入链表;
    1.2如果没找到,则错误
Status ListInsert(LinkList L, int i, ElemType e)
{
    pNode p;
    p=L->next;
    int j=1;
    while(p!=NULL&&j<i)//寻找第i个节点
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;
    
    pNode s=(pNode)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;

4.单链表删除第i个节点

思路:
1.声明一个节点指针p指向第一个节点,并不断后移,查找第i个节点(p指向第i-1个节点)
    1.1结果1:p->next=NULL,则第i个节点不存在
    1.2结果2:查找成功
Status ListDelete(LinkList L, int i, ElemType *e)
{
    pNode p;//声明指向指针
    p=L;//指向头节点
    
    int j=1;//j为计数器,统计指向第几-1个节点
    while(p->next!=NULL&&j<i)
    {
        p=p->next;
        ++j;
    }
    
    if(!(p->next)||j>i)
    return ERROR;//没找着
    
    *e=p->next->data;//找着了
    q=p->next;//q指向第i个节点
    p->next=q->next;//使原本指向第i个节点的指针指向第i+1个节点
    free(q);//回收第i个节点的空间
    return OK;

5.单链表的整表创建

思路:
1.创建一个空表L并初始化
2.节点指针p依次申请各元素节点空间并初始化
3.将新节点插入表
//头插法
void CreateListHead(LinkList L, int n)
{
    
    L=(LinkList)malloc(sizeof(Node));//L为头指针,指向头节点
    L->next=NULL;//初始化头节点
    
    pNode p;
    srand(time(0));//初始化随机数种子,
    
    for(int i=0;i<n;i++)
    {
    p=(pNode)malloc(sizeof(Node));//p指向一块node型空间
    p->data=rand()%100+1;//初始化p指向的节点
    
    p->next=L->next;
    L->next=p;//头插法
    }
}
//尾插法
void CreateListTail(LinkList L, int n)
{
    L=(LinkList)malloc(sizeof(Node));//L为头指针,指向头节点
    L->next=NULL;//初始化头节点
    
    pNode p,r;//p为新节点指针,r为链表尾指针
    r=L;//空表尾指针指向头节点
    
    for(int i=0;i<n;i++)
    {
        p=(pNode)malloc(sizeof(Node));//p指向一块node型空间
        p->data=rand()%100+1;//初始化p指向的节点
        
        r->next=p;
        r=p;//尾插法
    }
    r->next=NULL;//表示当前链表结束
}

6.单链表的整表删除

思路:
1.声明一个指向待删除节点的指针p,和一个定位指针q;
2.p指向第一个节点,q指向下一个节点;
3.释放p指向节点的空间后,p指向q的节点成为下一个待删除的节点,q再指向p的下一个节点
4.直到p=NULL,即全部删除完
5.使空表的指针指向NULL
Status ClearList(LinkList L)
{
    pNode p,q;
    p=L->next;
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    L->next=NULL;
    return OK;

标签:存储,线性表,指向,int,next,链式,NULL,节点,指针
From: https://www.cnblogs.com/wa2211lq/p/17449956.html

相关文章

  • 16)创建存储过程
    1、创建存储过程的语法:createprocedure存储过程名(参数1,参数2,...)begin存储过程语句块;end;存储过程有三种类型的参数:in:默认输入参数;out:输出参数;inout:既是输入也是输出参数;测试:实现一个输入学生号,得出学生选修课数目;delimiter$$createprocedureget_choos......
  • Java中将网上的png,jpg等存储在图片服务器中并且转成pdf,并且返回相应的url地址。
    通常在开发的时候,我们会遇到图片上传的功能,特别是有很多是提供url地址的方式。所以需要提供一个将url的图片等存储起来,然后提供一个我们自己的地址给用户使用。第一步:提供pdfbox的jar包。准备相应的maven    <dependency><groupId>org.apache.pdfbox</groupId......
  • SQLserver 与mysql中的varchar()类型关于存储汉字的个数;字符与字节的区别
    https://blog.csdn.net/qq_64314976/article/details/128604141https://www.cnblogs.com/chenmingjun/p/8118083.html今天遇到一个问题,mysql中的汉字,插入到sqlserver中报错,两边字段大小都是varchar(18)。汉字个数超过了9个,所以在SQLserver中报错我可以理解,因为1个汉字占用2个......
  • 存储过程
    新建带参数存储过程CREATEPROCEDURE[dbo].[UpdateMeetingConfigDate]( @MeetingCodeNVARCHAR(200))ASBEGINDECLARE@MeetingSnUNIQUEIDENTIFIER--定义一个参数开会SnSELECT@MeetingSn=Sn,@StartDate=StartDate,@MeetingStartTime=MeetingStartTime,@MeetingEndTi......
  • 哪款记事本可以在云端存储?云端记事本APP
    随着智能手机的发展,现在我们出门别的都可以不带,但是不带手机就没有安全感。此外目前越来越多的需求都可以在手机上解决了,例如之前想要记录事情就需要使用纸质的便签纸、记事本或笔记本来记录,但是现在直接在手机记事本APP中就能够随手记录文字、图片等内容了。   不过随着......
  • sparkSQL原理和使用——一般在生产中,基本都是使用hive做数据仓库存储数据,然后用spark
    一、sparkSQL概述1.1什么是sparkSQLSparkSQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。类似于hive的作用。1.2sparkSQL的特点1、容易集成:安装Spark的时候,已经集成好了。不需要单独安装。2、统一的数据访问方......
  • Mysql的存储过程
    一.存储过程的定义:存储过程(StoredProcedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。二. 存储过程的优点:简化应用开发人员的工作。当用不同语言编写多客户......
  • docker 在线迁移文件存储位置
    本教程只适用Docker版本>=v17.05.0命令df-Th可以看到当前docker存储的路径迁移docker文件cp-a/var/lib/docker/sdb2/修改daemon.json文件"graph":"/sdb2/docker"[root@devops~]#vim/etc/docker/daemon.json{"graph":"/sdb2/docker",&......
  • k8s存储服务解析
    卷访问模式             卷的subpath设置            存储卷的动态供给         因为storage自动创建pv需要经过kube-apiserver,所以需要授权    创建动态供给的deployment    需要一个deployme......
  • 深度剖析数据在内存中的存储
    一、数据的类型1、C语言中的数据类型可以分为以下几种:2、在C语言中char类型占1个字节short类型占2个字节int类型占4个字节long类型没有固定具体的大小,所占空间>=int类型所占空间longlong类型占8个字节float类型占4个字节double类型占8个字节……3、类型的意义     (1)这个(......