zoukankan      html  css  js  c++  java
  • 【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;    
    }
  • 相关阅读:
    增强型window.showModalDialog弹出模态窗口数据传递高度封装实验 西安
    谈谈Asp.net网站优化二:关于 服务器控件 和 客户端控件(html标签)的选择 西安
    谈谈Asp.net网站优化一:SqlDataReader和DataSet的选择 西安
    我2年来整理的.NET开发类库源代码共享 西安
    类似baidu google分页器效果的代码(修改于 kwklover 同学基础上) 西安
    C#.NET动手开发域名抢注前检测工具。 西安
    解决vs2008 项目文件(b/s)右键“在浏览器中打开”出现两个浏览器 西安
    基于Json的Ajax无刷新分页效果实现(一) 西安
    基于Json的Ajax无刷新分页效果实现(二) 西安
    循环冗余检验 (CRC) 算法原理
  • 原文地址:https://www.cnblogs.com/jamesharden/p/6399525.html
Copyright © 2011-2022 走看看