天天看点

链表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;
}