C语言泛型初探----C链表

来源:互联网 发布:单桂敏艾条淘宝旗舰店 编辑:程序博客网 时间:2024/06/04 19:44

C语言泛型,可以仿照 C库函数 qsort 的方式

用户提供 一些回调函数。

数据结构不包含数据域,

数据域 由分配节点内存的时候,多分配一些空间提供

数据域的地址:  

节点指针 是 p,则数据域地址为 p+1;

下面,是个简单的单链表实现


#include <stdio.h>
#include <stdlib.h>

#include <memory.h>

////类型定义

typedef struct LNode{
    struct LNode *next;
}*PLNode,*List;

/// 裸节点大小
enum{NodeOnlySize =(sizeof(struct LNode))};

#define NodeSize(elmSize) (NodeOnlySize + elmSize) ////节点大小,跟元素大小相关

#define GetElem(type,p)  (*(type*)(void *)(p + 1))  //// 取节点元素

////////////////////////////////////////////////////////

//// 回调函数定义

//// 1)复制函数,用于复制元素数据。

//// 2)释放函数,用于释放元素内部数据。

typedef void* (*copy_elm)(void *elm,const void *data,size_t elmsize);

typedef void (*free_elm)(void *elm);



////产生无数据节点,可以私有化
PLNode GenNode(int elmSize){
PLNode p = malloc(NodeSize(elmSize));
p->next =NULL;
return p;
}

//// 创建节点
PLNode CreateNode(copy_elm cpy,void *data,int elmSize){
    PLNode p =GenNode(NodeSize(elmSize));
    cpy(p + 1,data,elmSize);
    return p;
}

/// 创建链表,创建一个只有表头节点的链表
List Create(int elmSize){
     return  GenNode(NodeSize(elmSize));
}

///批量插入数据,批量前插
List insertFrontBulk(List lst,copy_elm cpy, int n,void *d,int elmSize){
    PLNode p;
    int i;
    if(!lst)
        return NULL;
    for(i=0;i<n;i++){
        p = CreateNode(cpy,d+i,elmSize);
        p ->next =lst ->next;
        lst->next = p;
    }
     return lst;
}



///前插
List insertFront(List lst,copy_elm cpy, void *d,int elmSize){
    PLNode p;
    if(!lst)
        return NULL;
    p = CreateNode(cpy,d,elmSize);
    p ->next =lst ->next;
    lst->next = p;
     return lst;
}

///批量插入数据,批量后插
List insertBackBulk(List lst,int n,copy_elm cpy, void *d,int elmSize){
    PLNode p=lst,q;
    int i;
    if(!p)return NULL;
    while(p->next){
        p =p->next;
    }
    for(i=0;i<n;i++){
        q = CreateNode(cpy,d+i,elmSize);
        q ->next =p ->next;
        p->next = q;
    }
    return lst;

}

///后插

List insertBack(List lst,copy_elm cpy, void *d,int elmSize){
    PLNode p=lst,q;
    if(!p)return NULL;
    while(p->next){
        p =p->next;
    }


    q = CreateNode(cpy,d,elmSize);
    q ->next =p ->next;
    p->next = q;
    return lst;

}


/// 销毁链表
void Destory(List lst,free_elm fre){
    PLNode p =lst,q;
 if(!lst)return ;
 p = lst->next;


 while(p){


        q = p;
        p = p->next;
        if(fre)
            fre(&q->next+1);
        free(q);
    }
 free(lst);
}




///实现数据复制
void *copyint(void *dst,const void *src,size_t n){
    *(int *)dst = *(int*)src;
    return dst;
}


int main()
{
    int n=10;
    const int elmSize = sizeof(int);
    List L =Create(elmSize);
    PLNode p ;


    while(n>0){
        ///insertFront(L,memcpy,&n,elmSize);
        insertBack(L,memcpy,&n,elmSize);
        --n;
    }


    p = L;
    while(p = p->next){
        printf("data =%d\n", GetElem(int,p));
    }

    Destory(L,NULL);

    printf("Hello world!\n");
    getchar();
    return 0;
}
0 0
原创粉丝点击