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