【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;    
}

 

posted @ 2017-02-14 22:35  LinuxRookie  阅读(2564)  评论(0编辑  收藏  举报