#ifndef _ZCH_LINKLIST_H_
#define _ZCH_LINKLIST_H_
//数据封装
typedef void LINKLIST;
//链表节点的指针域,注意这里没有数据域,要用这一套api,需要在外部将业务节点包含这个指针域,
//且该指针域应放在数据域的上面,为该节点的第一个域。
typedef struct _LinkListNode
{
struct _LinkListNode* next;
}LinkListNode
//创建
LinkList* Create();
//销毁
void Destory(LinkList* list);
//清除
void Clear(LinkList* list);
//获取链表的长度
int Length(LinkList* list);
//插入元素
int Insert(LinkList* list, LinkListNode* node, int pos);
//获取元素
LinkListNode* GetEle(LinkList* list, int pos);
//删除元素
LinkListNode* Delete(LinkList* list, int pos);
#endif
//实现
#include "zch_linklist.h
//链表的抽象
typedef struct _tag_LinkList
{
//头结点,保存后续节点的信息
LinkListNode header;
int length;
}TLinkList;
LinkList* Create()
{
TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
if(ret == NULL)
{
return NULL;
}
//为自己的内存负责
//memset(ret, 0, sizeof(TLinkList));
ret->header.next = NULL;
ret->length = 0;
return ret;
}
void Destory(LinkList* list)
{
if(list == NULL)
{
return;
}
free(list);
return;
}
void Clear(LinkList* list)
{
TLinkList* tList = (TLinkList*)list;
if(tList == NULL)
{
return;
}
tList->ltngth = 0;
tList->header.next = NULL;
return;
}
int Length(LinkList* list)
{
TLinkList* tList = (TLinkList*)list;
if(tList == NULL)
{
return -1;
}
return tList->length;
}
int Insert(LinkList* list, LinkListNode* node, int pos)
{
int i = 0;
TLinkList* tList = (TLinkList*)list;
LinkListNode* current = NULL;
if(tList == NULL || node == NULL)
{
return -1;
}
if(pos >= tList->length)
{
pos = tList->length; //容错,尾插
}
//辅助指针指向头节点
current = &tList->header;
for(i = 0; i < pos; i++)
{
current = current->next; // 0节点是header后面的第一个结点
//这样就刚好指向了pos位置的前节点,刚好可以获取到pos节点
}
node->next = current->next;
current->next = node;
tList->length++;
return 0;
}
LinkListNode* GetEle(LinkList* list, int pos)
{
int i = 0;
TLinkList* tList = (TLinkList*)list;
LinkListNode* current = NULL;
LinkListNode* ret = NULL;
if(tList == NULL || pos < 0 || pos >= tList->length)
{
return NULL;
}
current = &tList->header;
for(i = 0; i < pos && (current->next != NULL); i++)
{
current = current->next;
}
ret = current->next;
return ret;
}
LinkListNode* Delete(LinkList* list, int pos)
{
int i = 0;
TLinkList* tList = (TLinkList*)list;
LinkListNode* current = NULL;
LinkListNode* ret = NULL;
if(tList == NULL || pos < 0 || pos >= tList->length)
{
return NULL;
}
current = &tList->header;
for(i = 0; i < pos && (current->next != NULL); i++)
{
current = current->next;
}
ret = current->next;
current->next = ret->next;
tList->length--;
return ret;
}