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