线性表链式存储的基本操作

  线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任意元素。线性表链式存储结构特点是用一组任意的存储单元存储数据元素,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储本身信息外,还要存储指示其直接后继的信息(即直接后继的存储位置)。这两部分信息称为数据元素ai的存储映像,称为结点(node)。它包括两个域,其中存储数据信息的称为数据域,存储直接后继存储位置的域称为指针域。

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

typedef struct Node{    //节点类型定义
    ElemType data;      //数据域
    struct Node *next;  //指针域
}Node,*LinkList; //LinkList为结构指针类型
LintList L;      //为单链表的头指针,也称为单链表L 

假设L是LinkList型变量,则L是单链表的头指针,它指向表中第一个节点,若L为空(L=NULL),则所表示的线性表为空表,其长度n为0,有时我们在单链表的第一个结点前附设一个结点,称为“头结点”,头结点的数据域可以不存储任何信息,头结点的指针域指向第一个结点的指针(即第一个元素结点的存储位置)。

2、初始化单链表

//单链表的初始化
Status ListInit_L(LinkList &L){//构造一个空的单链表L
    L = (LinkList)malloc(sizeof(Node));    //产生一个头节点,并使L指向此头节点
    if(!L)
        exit(OVERFLOW);    //初始化失败
    L->next = NULL;    //指针域为空
    return OK;
}

3、单链表的销毁

//销毁单链表
Status ListDelete_L(LinkList &L){//前提条件:单链表已经存在
    LinkList q;
    if(L){
        q=L->next;//指向第一个节点
        free(L);//释放L
        L=q;
    }
    retun OK;
}

4、清空单链表

//单链表的清空
Status ListClear_L(LinkList &L){//前提条件,L存在,将L置为空表
    LinkList p,q;
    p=L->next;
    while(p){
        q=p->next;
        free(p);
        p=q;
    }
    L->next=NULL;//头节点指针域为空
    return 0;
} 

5、判断单链表是否为空

//判断单链表是否为空
Status ListEmpty_L(LinkList &L){
    //初始条件:线性表L已存在
    //操作结果:若L为空表,则返回TRUE,否则返回FALSE
    if(L->next)//非空
        return true;
    else
        return false;
}

6、计算单链表的长度

//计算单链表的长度
int ListLength_L(LinkList &L){
    //初始条件:线性表L已存在
    //操作结果:返回L中数据元素个数
    int i=0;
    LinkList p = L->next;    //指向第一个节点
    while(p){//p没到表尾
        i++;
        p=p->next;
    }
    return i;
}

 7、取元素

//取单链表中的数据元素
Status ListGet_L(LinkList &L,int i,ElemType &e){
    //初始条件:L为带头结点的单链表的头指针
    //操作结果:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
    int j=1;//计数器
    LinkList p=L->next;//指向第一个节点
    while(p || j<i){//顺指针向后查找,直到p指向第i个元素或p为空
        p=p->next;
        j++;
    }
    if(!p || j>i)//第i个元素不存在
        return ERROR;
    e = p->data;//取出第i个元素
    return OK;
} 

8、插入

//单链表的插入操作
Status ListInsert_L(LinkList &L, int i, ElemType e){
    //在带头结点的单链表L中的第i个位置之前插入元素e
    LinkList p=L;
    int j=0;
    while(p && j<i-1){//寻找第i-1的位置
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
        return ERROR;
    s = (LinkList)malloc(sizeof(Node));//创建一个新的结点s
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}

9、删除

//删除
Status ListDelete_L(LinkList &L, int i, ElemType &e){
    //在带头结点的单链表L中,删除第i个元素,并由e返回其值
    LinkList p=L;//指向第一个节点
    LinkList q;
    int j = 0;//计数器
    while(p && j<i-1){//寻找第i个结点
        p->next;
        j++;
    }
    while(!p || j>i-1)
        return ERROR;
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(p);
    return OK;
}

原文地址:https://www.cnblogs.com/geziyu/p/9691223.html

时间: 2024-11-06 09:47:48

线性表链式存储的基本操作的相关文章

线性表链式存储的实现详解

本文原创,转载请注明:http://blog.csdn.net/j903829182/article/details/38173681 #include<stdio.h> #include<malloc.h> //线性表的链式存储和实现,带头点 #define true 1 #define false 0 typedef int DataType;//定义抽象数据类型 //节点的结构体 typedef struct Node{ DataType data;//节点的数据域 stru

线性表链式存储结构的c语言实现

线性表链式存储结构的c语言实现的操作 <1>定义链式存储结构的结点. <2>初始化线性表 <3>判定是否为空 <4>清空列表 <5>返回L中数据元素个数 <6>用e返回L中第i个数据元素的值 <7>返回L中第1个与e满足关系的数据元素的位序,若没有则返回0 <8>在L中第i个位置之前插入新的数据元素e,L的长度加1 <9>删除L的第i个数据元素,并用e返回其值,L的长度减1 <10>依次

线性表链式存储设计与实现 - API实现

基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息 尾结点 链表中的最后一个数据结点,其下一元素指针为空,表示无后继. 链表技术领域推演 链表链式存储_api实现分析 在C语言中可以用结构体来定义链表中的指针域 链表中的表头结点也可以用结构体实现

数据结构(一)线性表链式存储实现

(一)前提 在前面的线性表顺序存储结构,最大的缺点是插入和删除需要移动大量的元素,需要耗费较多的时间.原因:在相邻两个元素的存储位置也具有邻居关系,他们在内存中的位置是紧挨着的,中间没有间隙,当然无法快速插入和删除.为了解决这个为题,出现了链式存储结构 (二)链式线性表两种结构(带有头结点和不带头结点) 不带头结点: 空链表: 带有头结点: 空链表: (三)头结点和头指针的区别 头指针: 1.头指针是指向第一个结点的指针,若是链表中只有头结点,则是指向头结点的指针 2.头指针具有标识作用,所以常

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

前面我们所讲的线性表的顺序存储结构,它是有优缺点,最大的缺点是插入与删除时需移动大量的元素,这显然需要耗费许多时间.这时,我们就引入线性表的链式存储结构,它的特点是:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.这就意味着,这些数据可以存在内存中未被占用的任意位置上,即当线性表进行插入与删除时就不需要移动大量的元素了,节约了时间. 链式结构中,除了需要存储数据元素的信息外,还要存储它的后继元素的存储地址.我们把存储数据元素信息的域称为数据域,把存储直接后继

【C语言--数据结构】线性表链式存储结构

直接贴代码 头文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__ typedef void LinkList; typedef struct _tag_LinkListNode { LinkList* next; }LinkListNode; LinkList* LinkList_create(); void LinkList_Destroy(LinkList* pstList); void LinkList_Clear(LinkList* pstL

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

链式存储 链式存储 :用一组任意的存储单元存储线性表中的数据元素.用这种方法存储的线性表简称线性链表. 存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的. 链表中结点的逻辑顺序和物理顺序不一定相同.(即不要求逻辑上相邻的元素在物理位置上也相邻) 为了正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址(或位置),称为指针(pointer)或链(link),这两部分组成了数据元素ai的存储映像 链表是通过每个结点

数据结构与算法——线性表链式存储(单链表)

今天总结单链表的实现. 什么是链表? 就是采去链式存储结构的线性表,所谓链式存储就好比火车的车厢一样,一节一节的连接起来,成为一个线性表.这种方式采用动态存储分配方式,即程序在运行时根据实际需要申请内存空间,不需要时将内存空间释放掉. 链表用一组任意的存储单元存放线性表中的各个元素,这组存储单元可以是连续的,也可以是不连续的. 什么是单链表? 单链表简单理解就是单向的,就像火车一样.如果将火车头与火车为连接在一块,就构成了循环链表. 链表的结构:链表采用节点结构,这个节点分为两部分,一部分存储数

线性表链式存储结构

链式存储 :用一组任意的存储单元存储线性表中的数据元素.用这种方法存储的线性表简称线性链表.存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的. 为了正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其直接后继结点的地址(或位置),称为指针(pointer)或链(link),这两部分 组成了链表中的结点结构,如下图所示. data :数据域,存放结点的值.next :指针域,存放结点的直接后继的地址. 指针域和数据域组成数据元素称