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
- C语言泛型初探----C链表
- C语言指针初探
- C语言指针初探
- c语言 内存初探
- 【初探】遇见C语言
- C语言初探
- C语言中const初探
- C语言初探 之 %p
- Just Do C, Chapter1:C语言初探
- 【C语言】-->语法 fgets函数原理初探
- c语言指针初探 一 内存管理
- select初探(c/c++)
- Java初探:浅谈Java语言和C语言的区别
- C语言学习笔记(3)指针初探
- 克服C语言gets函数缺陷的方法初探
- C语言初探 之 printf压栈顺序
- [转] 克服C语言gets函数缺陷的方法初探
- [零基础学软件开发5]c语言数据类型初探
- Leetcode #172 Factorial Trailing Zeroes
- sql中AS用法
- BroadcastReceiver的学习
- codeforces 593D Happy Tree Party Lca+并查集
- RadixTree(基数树)
- C语言泛型初探----C链表
- Unity3d 屏幕空间人体皮肤知觉渲染&次表面散射Screen-Space Perceptual Rendering & Subsurface Scattering of Human Skin
- 【深入Java虚拟机】之二:Class类文件结构
- 第十周 项目2-二叉树遍历的递归算法
- 工程师的知识结构
- LeetCode Ugly Numbers 数学
- BLE型的智能遥控器传输速率
- MAT 工具的安装
- 第10周上机实践项目3 - 利用二叉树遍历思想解决问题