【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* pstList);
int LinkList_Lenght(LinkList* pstList);
int LinkList_Insert(LinkList* pstList, LinkListNode* pstNode, int iPos);
LinkListNode* LinkList_Get(LinkList* pstList, int iPos);
LinkListNode* LinkList_Delete(LinkList* pstList, int iPos);

#endif /* #ifndef __LINKLIST_H__ */

函数实现

/*
** 线性表的链式存储
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "LinkList.h"

typedef struct _tag_LinkList
{
    LinkListNode header;
    int length;
}TLinkList;

/**************************************************************************
** 函 数 名: LinkList_Create
** 函数作用: 创建一个链式存储的线性表
** 函数参数: void
** 返 回 值: LinkList*
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
LinkList* LinkList_create()
{
    TLinkList* pstRet = (TLinkList *)malloc(sizeof(TLinkList));

    if (NULL != pstRet)
    {
        pstRet->length = 0;
        pstRet->header.next = NULL;
    }

    return pstRet;
}

/**************************************************************************
** 函 数 名: LinkList_Destroy
** 函数作用: 销毁一个链式存储的线性表
** 函数参数: LinkList*
** 返 回 值: void
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
void LinkList_Destroy(LinkList* pstList)
{
    free(pstList);
}

/**************************************************************************
** 函 数 名: LinkList_Clear
** 函数作用: 清空一个链式存储的线性表
** 函数参数: LinkList*
** 返 回 值: void
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
void LinkList_Clear(LinkList* pstList)
{
    TLinkList* pstRet = (TLinkList *)pstList;

    if (NULL != pstRet)
    {
        pstRet->length = 0;
        pstRet->header.next = NULL;
    }
    return;
}

/**************************************************************************
** 函 数 名: LinkList_Lenght
** 函数作用: 得到一个链式存储的线性表的长度
** 函数参数: LinkList*
** 返 回 值: int
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
int LinkList_Lenght(LinkList* pstList)
{
    TLinkList* pstRet = (TLinkList *)pstList;
    int iRet = -1;

    if (NULL != pstRet)
    {
        iRet = pstRet->length;
    }

    return iRet;
}

/**************************************************************************
** 函 数 名: LinkList_Insert
** 函数作用: 在一个链式存储的线性表的指定位置插入节点
** 函数参数: LinkList* pstList
**           LinkListNode* pstNode
**           int iPos
** 返 回 值: int
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
int LinkList_Insert(LinkList* pstList, LinkListNode* pstNode, int iPos)
{
    TLinkList* pstTemp = (TLinkList *)pstList;
    LinkListNode* pstNodeCurrent;
    int iRet = ((NULL != pstTemp) && (iPos >= 0) && (NULL != pstNode));
    int iLoop;

    if (iRet)
    {
        pstNodeCurrent = (LinkListNode*)pstTemp;

        for (iLoop = 0; (iLoop < iPos) && (pstNodeCurrent->next != NULL); iLoop++)
        {
            pstNodeCurrent = pstNodeCurrent->next;
        }

        pstNode->next = pstNodeCurrent->next;
        pstNodeCurrent->next = pstNode;
        pstTemp->length++;
    }

    return iRet;
}

/**************************************************************************
** 函 数 名: LinkList_Get
** 函数作用: 获得一个链式存储的线性表的指定位置节点
** 函数参数: LinkList* pstList
**           int iPos
** 返 回 值: LinkListNode*
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
LinkListNode* LinkList_Get(LinkList* pstList, int iPos)
{
    TLinkList* pstTemp = (TLinkList *)pstList;
    LinkListNode* pstNodeRet = NULL;
    LinkListNode* pstNodeCur = NULL;
    int iLoop;

    if ((NULL != pstTemp) && (iPos >= 0) && (iPos <= pstTemp->length))
    {
        pstNodeCur = (LinkListNode*)pstTemp;

        for (iLoop = 0; iLoop < iPos; iLoop++)
        {
            pstNodeCur = pstNodeCur->next;
        }

        pstNodeRet = pstNodeCur->next;
    }

    return pstNodeRet;
}

/**************************************************************************
** 函 数 名: LinkList_Delete
** 函数作用: 删除一个链式存储的线性表的指定位置节点
** 函数参数: LinkList* pstList
**           int iPos
** 返 回 值: LinkListNode*
**
** 日    期: 2017年2月14日
** 作    者: Rookie
***************************************************************************/
LinkListNode* LinkList_Delete(LinkList* pstList, int iPos)
{
    TLinkList* pstTemp = (TLinkList *)pstList;
    LinkListNode* pstNodeRet = NULL;
    LinkListNode* pstNodeCur = NULL;
    int iLoop;

    if ((NULL != pstTemp) && (iPos >= 0) && (iPos < pstTemp->length))
    {
        pstNodeCur = (LinkListNode*)pstTemp;

        for (iLoop = 0; iLoop < iPos; iLoop++)
        {
            pstNodeCur = pstNodeCur->next;
        }

        pstNodeRet = pstNodeCur->next;
        pstNodeCur->next = pstNodeRet->next;
        pstTemp->length--;
    }

    return pstNodeRet;
}
时间: 2024-10-06 11:49:23

【C语言--数据结构】线性表链式存储结构的相关文章

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

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

线性表链式存储结构的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>依次

线性表链式存储结构

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

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

今天总结静态链表. 什么是静态链表? 我理解静态链表是一种伪链表,因为它没有使用指针.静态链表使用数组实现的,这个数组是一个结构体数组,结构体由数据域和指针域构成,与单链表不同的是,这个指针域并不是指针,而是一个整数,用来指向下一个结点(数组下标). 静态链表中实际上相当于有两个链表,一个时实际数据所构成的一个链表,另一个是数组中空元素所构成的链表,称为空闲链表或备用链表,用来存放插入进来的元素. 心得:静态链表感觉比单链表,双向链表绕很多,看书的时候,书上在释放结点空间那块写的很复杂,后来和我

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

本文原创,转载请注明: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

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

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

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

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

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

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

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

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