LinkList.h
#ifndef LINK_LIST_H#define LINK_LIST_H
//链表节点
typedef struct _LinkListNode
{
struct _LinkListNode *next;
}LinkListNode;
//单链表
typedef void LinkList;
/*
* 创建单链表
* @return 返回单链表的指针
*/
LinkList* LinkList_Create();
/*
* 销毁单链表
* @param list 单链表的指针
*/
void LinkList_Destroy(LinkList *list);
/*
* 清空单链表
* @param list 单链表的指针
*/
void LinkList_Clear(LinkList *list);
/*
* 向单链表pos位置处插入元素
* @param list 单链表指针
* @param node 元素指针
* @param pos 插入的索引
*/
int LinkList_Insert(LinkList *list,LinkListNode *node,int pos);
/*
* 获取单链表中索引位置处的元素
* @param list 单链表指针
* @param pos 单链表索引值
* @param return 元素指针
*/
LinkListNode* LinkList_Get(LinkList *list,int pos);
/*
* 删除单链表中索引位置处的值
* @param list 单链表的指针
* @param pos 单链表索引
* @param return 非0表示删除成功
*/
int LinkList_Remove(LinkList *list,int pos);
/*
* 获取单链表当前已存储元素的个数
* @param list 单链表的指针
* @return 单链表中已存储元素的个数
*/
int LinkList_Length(LinkList *list);
#endif // LINKLIST_H
LinkLink.c
#include "Linklist.h"#include //单链表typedef struct _LinkList{ LinkListNode header;//链表头节点 int length;//链表长度}TLinkList;/* * 创建单链表 * @return 返回单链表的指针 */LinkList* LinkList_Create(){ TLinkList * list = (TLinkList *)malloc(sizeof(LinkList)); if(list != 0) { list->header.next = 0; //初始化头结点的后继指针为空 list->length = 0; } return list;}/* * 销毁单链表 * @param list 单链表的指针 */void LinkList_Destroy(LinkList *list){ free(list);}/* * 清空单链表 * @param list 单链表的指针 */void LinkList_Clear(LinkList *list){ if(list != 0) { TLinkList* l_list = (TLinkList *)list; l_list->header.next = 0; l_list->length = 0; }}/* * 向单链表pos位置处插入元素 * @param list 单链表指针 * @param node 元素指针 * @param pos 插入的索引 */int LinkList_Insert(LinkList *list,LinkListNode *node,int pos){ //类型转换 TLinkList* l_list = (TLinkList *)list; //判断链表指针和节点指针不能为空,当前插入的位置是否合法 int ret = ((list != 0) && (node != 0) && (pos >= 0) && (pos <= l_list->length)); if(ret) { LinkListNode* current = (LinkList *)l_list; int i; //移动到需要插入的位置的前驱 for(i = 0; i < pos;i++) { current = current->next; } node->next = current->next; //被插入节点的后继指针指向前驱节点的后继指针 current->next = node; //前驱节点的后继指针指向被插入节点 l_list->length++; } return ret;}/* * 获取单链表中索引位置处的元素 * @param list 单链表指针 * @param pos 单链表索引值 * @param return 元素指针 */LinkListNode* LinkList_Get(LinkList *list,int pos){ LinkListNode* node = 0; TLinkList * l_list = (TLinkList *)list; //判断链表指针不为空,且获取的索引合法 if( (l_list != 0) && (pos >= 0) && (pos < l_list->length) ) { LinkListNode* current = (LinkList *)l_list; int i; for(i = 0; i < pos; i++) { current = current->next; } node = current->next; } return node;}/* * 删除单链表中索引位置处的值 * @param list 单链表的指针 * @param pos 单链表索引 * @param return 非0表示删除成功 */int LinkList_Remove(LinkList *list,int pos){ TLinkList * l_list = (TLinkList *)list; int ret = ((l_list != 0) && (pos >= 0) && (pos < l_list->length)); if(ret) { LinkListNode* current = (LinkList *)l_list; int i; for(i = 0; i < pos; i++) { current = current->next; } //被删除元素的前驱元素的后继指针,指向被删除元素的后继指针 current->next = current->next->next; l_list->length--; } return ret;}/* * 获取单链表当前已存储元素的个数 * @param list 单链表的指针 * @return 单链表中已存储元素的个数 */int LinkList_Length(LinkList *list){ int ret = -1; if(list != 0) { TLinkList * l_list = (TLinkList *)list; ret = l_list->length; } return ret;}
测试代码
#include #include "Linklist.h"typedef struct _node{ LinkListNode node; int v;}Node;int main(void){ int i; Node n[5]; Node *node; for(i = 0;i < 5;i++) { n[i].v = i; } LinkList *list = LinkList_Create(); for(i = 0; i < 5;i++) { LinkList_Insert(list,(LinkListNode *)&(n[i]),0); } LinkList_Remove(list,2); for(i = 0; i < LinkList_Length(list);i++) { node = (Node *)LinkList_Get(list,i); printf("%d\n",node->v); } return 0;}