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 <malloc.h>
//单链表
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 <stdio.h>
#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;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。