纯c语言通用链表


纯c语言通用链表


概述

c语言标准库不存在链表, 所以为了数据的简单操作自己写了一份链表


代码

############               general_list.h             ##############


#ifndef __GENERAL_LIST_H__
#define __GENERAL_LIST_H__


#ifdef __cplusplus
extern "C"
{
#endif


/*
    * 宏定义通用节点结构体
*/
typedef struct GeneralNode
{
    void* data;
    struct GeneralNode *next;
}GeneralNode;


/*
    * 宏定义通用链表结构体
*/
typedef struct GeneralList
{
    GeneralNode* first;
    GeneralNode* last;
    int count;
} GeneralList;


/*
    * 宏定义通用迭代器结构体
*/
typedef struct myListIterator
{
    GeneralNode* p;
    int count;
    int allSize;
} GeneralListIterator;


/*
    * 功能:  创建链表
    * 返回值, 成功返回链表指针,失败返回NULL
*/
GeneralList* createGeneralList();

/*
    * 功能:  释放链表
    * 参数1: 需要操作的链表
    * 返回值, 无
*/
void freeGeneralList(GeneralList* pGeneralList);

/*
    * 功能:  释放链表,保留表头
    * 参数1: 需要操作的链表
    * 返回值, 无
*/
void freeGeneralListSaveHead(GeneralList* pGeneralList);

/*
    * 功能:  尾部插入链表
    * 参数1: 需要操作的链表
    * 参数2: 插入的数据
    * 参数3: 数据大小
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListInsertDataAtLast(GeneralList * const pGeneralList, void* const pData, const int nSize);

/*
    * 功能:  首部插入链表
    * 参数1: 需要操作的链表
    * 参数2: 插入的数据
    * 参数3: 数据大小
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListInsertDataAtFirst(GeneralList * const pGeneralList, void* const pData, const int nSize);

/*
    * 功能:  获取链表长度
    * 参数1: 需要操作的链表
    * 返回值, 链表的长度, >=0表示成功, <0表示失败
*/
int generalListGetSize(const GeneralList * const pGeneralList);

/*
    * 功能:  输出链表
    * 参数1: 需要操作的链表
    * 参数2: 输出回调函数
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListOutput(const GeneralList * const pGeneralList, void(*pt)(const void* const));

/*
    * 功能:  删除链表首部节点
    * 参数1: 需要操作的链表
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListRemoveDataAtFirst(GeneralList * const pGeneralList);

/*
    * 功能:  删除链表尾部节点
    * 参数1: 需要操作的链表
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListRemoveDataAtLast(GeneralList* const pGeneralList);

/*
    * 功能:  链表插入节点
    * 参数1: 需要操作的链表
    * 参数2: 插入的数据
    * 参数3: 数据大小
    * 参数3: 需要插入的位置(在某个元素之后,0表示表头)
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListInsertDataAt(GeneralList* const pGeneralList, void* const pData, const int nSize, const int nIndex);

/*
    * 功能:  删除链表某个节点
    * 参数1: 需要操作的链表
    * 参数2: 需要删除的位置(>0)
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListRemoveDataAt(GeneralList* const pGeneralList, const int nIndex);

/*
    * 功能:  获取链表第一个节点
    * 参数1: 需要操作的链表
    * 返回值, 链表的节点
*/
void* generalListGetDataAtFirst(const GeneralList * const pGeneralList);

/*
    * 功能:  获取链表最后一个节点
    * 参数1: 需要操作的链表
    * 返回值, 链表的节点
*/
void* generalListGetDataAtLast(const GeneralList * const pGeneralList);

/*
    * 功能:  获取链表某个节点
    * 参数1: 需要操作的链表
    * 参数2: 需要获取节点的位置(>0)
    * 返回值, 链表的节点
*/
void* generalListGetDataAt(const GeneralList* const pGeneralList, const int nIndex);

/*
    * 功能:  创建迭代器
    * 参数1: 需要操作的链表
    * 返回值, 迭代器
*/
GeneralListIterator* createGeneralListIterator(const GeneralList * const pGeneralList);

/*
    * 功能:  释放迭代器
    * 参数1: 需要操作的迭代器
    * 返回值, 无
*/
void freeGeneralListIterator(GeneralListIterator* pIterator);

/*
    * 功能:  判断迭代器是否还有下个元素
    * 参数1: 需要操作的迭代器
    * 返回值, 返回迭代器还存在节点个数
*/
int generalListIteratorHasNext(const GeneralListIterator* const pIterator);

/*
    * 功能:  返回迭代器下个元素
    * 参数1: 需要操作的迭代器
    * 返回值, 返回迭代器下个元素
*/
void* generalListIteratorNext(GeneralListIterator* const pIterator);






#ifdef __cplusplus
}
#endif

#endif /*__GENERAL_LIST_H__*/




##########        general_list.c       ##############


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "general_list.h"


/*
    * 功能:  创建链表
    * 返回值, 成功返回链表指针,失败返回NULL
*/
GeneralList* createGeneralList()
{
    GeneralList* pGeneralList = (GeneralList*) malloc(sizeof(GeneralList));
    if(NULL == pGeneralList)
    {
        printf("createGeneralList malloc list memory error!\n");
        return NULL;
    }

    pGeneralList->count = 0;
    pGeneralList->first = NULL;
    pGeneralList->last  = NULL;
    return pGeneralList;
}


/*
    * 功能:  释放链表
    * 参数1: 需要操作的链表
    * 返回值, 无
*/
void freeGeneralList(GeneralList* pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        return;
    }

    GeneralNode* p = NULL;
    while (NULL != pGeneralList->first)
    {
        p = pGeneralList->first->next;
        free(pGeneralList->first);
        pGeneralList->first = p;
    }
    free(pGeneralList);

    return;
}


/*
    * 功能:  释放链表,保留表头
    * 参数1: 需要操作的链表
    * 返回值, 无
*/
void freeGeneralListSaveHead(GeneralList* pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        return;
    }

    GeneralNode* p = NULL;
    while (NULL != pGeneralList->first)
    {
        p = pGeneralList->first->next;
        free(pGeneralList->first);
        pGeneralList->first = p;
    }

    //清空表头
    pGeneralList->count = 0;
    pGeneralList->first = NULL;
    pGeneralList->last  = NULL;

    return;
}



/*
    * 功能:  尾部插入链表
    * 参数1: 需要操作的链表
    * 参数2: 插入的数据
    * 参数3: 数据大小
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListInsertDataAtLast(GeneralList * const pGeneralList, void* const pData, const int nSize)
{
    //参数合法性检查
    if(NULL == pGeneralList || 0 > nSize)
    {
        printf("generalListInsertDataAtLast pGenerallist is null or nSize(%d) error!\n", nSize);
        return -1;
    }

    //创建数据
    void* data = NULL;
    if(0 < nSize && NULL != pData)
    {
        data = (void*) malloc(nSize);
        if(NULL == data)
        {
            printf("generalListInsertDataAtLast malloc data memory error!\n");
            return -1;
        }
        memcpy(data, pData, nSize);
    }

    //创建节点
    GeneralNode* node = (GeneralNode*) malloc(sizeof(GeneralNode));
    if(NULL == node)
    {
        printf("generalListInsertDataAtLast malloc node memory error!\n");
        free(data);
        return -1;
    }

    node->data = data;
    node->next = NULL;
    if(0 < pGeneralList->count)
    {

        pGeneralList->last->next = node;
        pGeneralList->last       = node;
    }
    else
    {
        pGeneralList->first = node;
        pGeneralList->last  = node;
    }
    (pGeneralList->count)++;

    return 0;
}


/*
    * 功能:  首部插入链表
    * 参数1: 需要操作的链表
    * 参数2: 插入的数据
    * 参数3: 数据大小
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListInsertDataAtFirst(GeneralList * const pGeneralList, void* const pData, const int nSize)
{

    //参数合法性检查
    if(NULL == pGeneralList || 0 > nSize)
    {
        printf("generalListInsertDataAtFirst pGenerallist is null or nSize(%d) error!\n", nSize);
        return -1;
    }

    //创建数据
    void* data = NULL;
    if(0 < nSize && NULL != pData)
    {
        data = (void*) malloc(nSize);
        if(NULL == data)
        {
            printf("generalListInsertDataAtFirst malloc data memory error!\n");
            return -1;
        }
        memcpy(data, pData, nSize);
    }

    GeneralNode* node = (GeneralNode*) malloc(sizeof(GeneralNode));
    if(NULL == node)
    {
        printf("generalListInsertDataAtFirst malloc node memory error!\n");
        free(data);
        return -1;
    }

    node->data = data;
    node->next = NULL;

    if (0 < pGeneralList->count)
    {
        node->next = pGeneralList->first;
        pGeneralList->first = node;
    }
    else
    {
        pGeneralList->first = node;
        pGeneralList->last  = node;
    }
    (pGeneralList->count)++;

    return 0;
}


/*
    * 功能:  获取链表长度
    * 参数1: 需要操作的链表
    * 返回值, 链表的长度, >=0表示成功, <0表示失败
*/
int generalListGetSize(const GeneralList * const pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListGetSize pGenerallist is null!\n");
        return -1;
    }

    return pGeneralList->count;
}


/*
    * 功能:  输出链表
    * 参数1: 需要操作的链表
    * 参数2: 输出回调函数
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListOutput(const GeneralList * const pGeneralList, void(*pt)(const void* const))
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListOutput pGenerallist is null!\n");
        return -1;
    }

    GeneralNode* p = pGeneralList->first;
    while (NULL != p)
    {
        (*pt)(p->data);
        p = p->next;
    }

    return 0;
}


/*
    * 功能:  删除链表首部节点
    * 参数1: 需要操作的链表
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListRemoveDataAtFirst(GeneralList * const pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListRemoveDataAtFirst pGenerallist is null!\n");
        return -1;
    }

    GeneralNode* p = pGeneralList->first;
    if(NULL == p)
    {
        //链表为空
        return 0;
    }

    pGeneralList->first = p->next;
    void* re = p->data;
    free(p);
    (pGeneralList->count)--;
    if (pGeneralList->count == 0)
    {
        pGeneralList->last = NULL;
    }

    //释放数据
    free(re);
    re = NULL;

    return 0;
}


/*
    * 功能:  删除链表尾部节点
    * 参数1: 需要操作的链表
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListRemoveDataAtLast(GeneralList* const pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListRemoveDataAtLast pGenerallist is null!\n");
        return -1;
    }

    if(0 == pGeneralList->count)
    {   //链表为空
        return 0;
    }
    else if(1 == pGeneralList->count)
    {
        //链表只有一个节点
        return generalListRemoveDataAtFirst(pGeneralList);
    }
    else
    {
        //链表存在多个节点
        GeneralNode* p = pGeneralList->first;
        if(NULL == p)
        {
            printf("generalListRemoveDataAtLast list exists error!\n");
            return -1;
        }

        //找到尾部的前一个节点
        while (p->next != pGeneralList->last)
        {
            p = p->next;
        }

        void *re = pGeneralList->last->data;
        free(pGeneralList->last);
        p->next = NULL;
        pGeneralList->last = p;
        (pGeneralList->count)--;

        //释放数据
        free(re);
        re = NULL;

        return 0;
    }
}


/*
    * 功能:  链表插入节点
    * 参数1: 需要操作的链表
    * 参数2: 插入的数据
    * 参数3: 数据大小
    * 参数3: 需要插入的位置(在某个元素之后,0表示表头)
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListInsertDataAt(GeneralList* const pGeneralList, void* const pData, const int nSize, const int nIndex)
{
    //参数合法性检查
    if(NULL == pGeneralList || 0 > nSize)
    {
        printf("generalListInsertDataAt pGenerallist is null or nSize(%d) error!\n", nSize);
        return -1;
    }

    if(0 > nIndex || pGeneralList->count < nIndex)
    {
        printf("generalListInsertDataAt insert index(%d) or max index(%d) error!\n", nIndex, pGeneralList->count);
        return -1;
    }

    if (0 == nIndex)
    {
        //插入表头
        return generalListInsertDataAtFirst(pGeneralList, pData, nSize);
    }
    else if (nIndex == pGeneralList->count)
    {
        //插入表尾
        return generalListInsertDataAtLast(pGeneralList, pData, nSize);
    }
    else
    {
        //存在至少一个节点

        //创建数据
        void* data = NULL;
        if(0 < nSize && NULL != pData)
        {
            data = (void*) malloc(nSize);
            if(NULL == data)
            {
                printf("generalListInsertDataAt malloc data memory error!\n");
                return -1;
            }
            memcpy(data, pData, nSize);
        }

        GeneralNode* node = (GeneralNode*) malloc(sizeof(GeneralNode));
        if(NULL == node)
        {
            printf("generalListInsertDataAt malloc node memory error!\n");
            free(data);
            return -1;
        }

        node->data = data;
        node->next = NULL;

        GeneralNode* p = pGeneralList->first;
        if(NULL == p)
        {
            printf("generalListInsertDataAt list exists error!\n");
            free(data);
            free(node);
            return -1;
        }

        //找到插入节点(插入数据在这个节点之后)
        int i = 0;
        for (; i < nIndex - 1; i++)
        {
            p = p->next;
            if(NULL == p)
            {
                printf("generalListInsertDataAt list exists error!\n");
                free(data);
                free(node);
                return -1;
            }
        }
        node->next = p->next;
        p->next = node;

        (pGeneralList->count)++;
        return 0;
    }
}


/*
    * 功能:  删除链表某个节点
    * 参数1: 需要操作的链表
    * 参数2: 需要删除的位置(>0)
    * 返回值, >=0表示成功, <0表示失败
*/
int generalListRemoveDataAt(GeneralList* const pGeneralList, const int nIndex)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListRemoveDataAt pGenerallist is null!\n");
        return -1;
    }

    if(0 >= nIndex || pGeneralList->count < nIndex)
    {
        printf("generalListRemoveDataAt remove index(%d) or max index(%d) error!\n", nIndex, pGeneralList->count);
        return -1;
    }

    if(1 == nIndex)
    {
        //删除首节点
        return generalListRemoveDataAtFirst(pGeneralList);
    }
    else if (nIndex == pGeneralList->count)
    {
        //删除尾节点
        return generalListRemoveDataAtLast(pGeneralList);
    }
    else
    {
        //存在多个节点,删除中间节点
        GeneralNode * p = pGeneralList->first;
        if(NULL == p)
        {
            printf("generalListRemoveDataAt list exists error!\n");
            return -1;
        }

        //找到删除前面一个节点
        int i = 0;
        for (; i < nIndex - 2; i++)
        {
            p = p->next;
            if(NULL == p)
            {
                printf("generalListRemoveDataAt list exists error!\n");
                return -1;
            }
        }

        //需要删除的节点
        GeneralNode* tp = p->next;
        if(NULL == tp)
        {
            printf("generalListRemoveDataAt list exists error!\n");
            return -1;
        }

        p->next = p->next->next;
        void* re = tp->data;
        free(tp);
        (pGeneralList->count)--;

        //释放节点
        free(re);
        re = NULL;

        return 0;
    }

}


/*
    * 功能:  获取链表第一个节点
    * 参数1: 需要操作的链表
    * 返回值, 链表的节点
*/
void* generalListGetDataAtFirst(const GeneralList * const pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListGetDataAtFirst pGenerallist is null!\n");
        return NULL;
    }

    return pGeneralList->first->data;
}


/*
    * 功能:  获取链表最后一个节点
    * 参数1: 需要操作的链表
    * 返回值, 链表的节点
*/
void* generalListGetDataAtLast(const GeneralList * const pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListGetDataAtLast pGenerallist is null!\n");
        return NULL;
    }

    return pGeneralList->last->data;
}


/*
    * 功能:  获取链表某个节点
    * 参数1: 需要操作的链表
    * 参数2: 需要获取节点的位置(>0)
    * 返回值, 链表的节点
*/
void* generalListGetDataAt(const GeneralList* const pGeneralList, const int nIndex)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("generalListGetDataAt pGenerallist is null!\n");
        return NULL;
    }

    if(0 >= nIndex || pGeneralList->count < nIndex)
    {
        printf("generalListGetDataAt get index(%d) or max index(%d) error!\n", nIndex, pGeneralList->count);
        return NULL;
    }

    if(1 == nIndex)
    {
        //首节点
        return generalListGetDataAtFirst(pGeneralList);
    }
    if(nIndex == pGeneralList->count)
    {
        //尾节点
        return generalListGetDataAtLast(pGeneralList);
    }
    else
    {
        //中间节点
        GeneralNode* p = pGeneralList->first;
        if(NULL == p)
        {
            printf("generalListGetDataAt list exists error!\n");
            return NULL;
        }

        //找到获取的节点
        int i = 0;
        for (; i < nIndex - 1; i++)
        {
            p = p->next;
            if(NULL == p)
            {
                printf("generalListGetDataAt list exists error!\n");
                return NULL;
            }
        }

        return p->data;
    }

}


/*
    * 功能:  创建迭代器
    * 参数1: 需要操作的链表
    * 返回值, 迭代器
*/
GeneralListIterator* createGeneralListIterator(const GeneralList * const pGeneralList)
{
    //参数合法性检查
    if(NULL == pGeneralList)
    {
        printf("createGeneralListIterator pGenerallist is null!\n");
        return NULL;
    }

    GeneralListIterator* re = (GeneralListIterator*) malloc(sizeof(GeneralListIterator));
    if(NULL == re)
    {
        printf("createGeneralListIterator malloc iterator memory error!\n");
        return NULL;
    }

    re->p       = pGeneralList->first;
    re->allSize = pGeneralList->count;
    re->count   = 0;

    return re;
}


/*
    * 功能:  释放迭代器
    * 参数1: 需要操作的迭代器
    * 返回值, 无
*/
void freeGeneralListIterator(GeneralListIterator* pIterator)
{
    free(pIterator);
}


/*
    * 功能:  判断迭代器是否还有下个元素
    * 参数1: 需要操作的迭代器
    * 返回值, 返回迭代器还存在节点个数
*/
int generalListIteratorHasNext(const GeneralListIterator* const pIterator)
{
    //参数合法性检查
    if(NULL == pIterator)
    {
        printf("generalListIteratorHasNext pIterator is null!\n");
        return -1;
    }

    return (pIterator->allSize) - (pIterator->count);
}


/*
    * 功能:  返回迭代器下个元素
    * 参数1: 需要操作的迭代器
    * 返回值, 返回迭代器下个元素
*/
void* generalListIteratorNext(GeneralListIterator* const pIterator)
{
    //参数合法性检查
    if(NULL == pIterator)
    {
        printf("generalListIteratorNext pIterator is null!\n");
        return NULL;
    }

    if(NULL == pIterator->p)
    {
        printf("generalListIteratorNext node is null!\n");
        return NULL;
    }

    void* re = pIterator->p->data;
    pIterator->p = pIterator->p->next;
    (pIterator->count)++;

    return re;
}



##########        main.c     #############

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "general_list.h"


typedef struct TEST
{  
    int i;  
    char c;  
} TEST;  
  
void callbackOutput(const void* const p)  
{  
    if(NULL != p)
	{
		TEST * pTest= (TEST*)p;  
		printf("i: %d   c: (%c)\n", pTest->i, pTest->c);  
	}
}


int main()
{

    //创建链表  
    GeneralList* list= createGeneralList();
    if(NULL == list)
    {
        printf("create list failure!\n");
        return 0;
    }
  
    //测试三种插入方法
	TEST test1;
	test1.c = 'A';
	test1.i = 65;
    generalListInsertDataAtLast(list, &test1, sizeof(TEST));
	//输出  
    generalListOutput(list, callbackOutput);  

    TEST test2;
	test2.c = 'B';
	test2.i = 66;
    generalListInsertDataAtFirst(list, &test2, sizeof(TEST));
	//输出  
    generalListOutput(list, callbackOutput);
    
    TEST test3;
	test3.c = 'C';
	test3.i = 67;
    generalListInsertDataAt(list, &test3, sizeof(TEST), 2);
	//输出  
    generalListOutput(list, callbackOutput);
    
	printf("!!!!!!!!!!!!!!!!!!\n");

    //测试迭代器遍历输出
	GeneralListIterator * it = createGeneralListIterator(list); 
    if(NULL == list)
    {
        printf("create iterator failure!\n");
        //释放链表  
        freeGeneralList(list); 
        return 0;
    }
    
    while(0 < generalListIteratorHasNext(it))  
    {  
        TEST* pTest = (TEST*)generalListIteratorNext(it);
		if(NULL == pTest)
        {
            break;
        }
        else
		{
            printf("i: %d   c: (%c)\n", pTest->i, pTest->c);  
		}
    }

    //释放迭代器  
    freeGeneralListIterator(it);  
  
    //释放链表  
    freeGeneralList(list);  

    return 0; 

}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值