天天看點

連結清單api的設計與實作

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