编译时用的命令: gcc -g DList.c -o DList或
gcc DList.c -o DList
因为是c语言程序,不是c++,所以不用g++命令(否则报错)
#include <stdio.h>
#include <stdlib.h>
//通用双向链表
typedef int DListRet;
//ctx: 上下文,是所有回调函数实例的公共的环境(变量)
//data: 输入参数,只被当前回调函数实例所处理
typedef DListRet (*DListVisitFunc)(void *ctx, void *data);
#define DLIST_RET_OK 1
#define DLIST_RET_STOP 2
typedef struct _DListNode{
struct _DListNode* prev;
struct _DListNode* next;
void* data;
}DListNode;
typedef struct _DList{
DListNode *first;
}DList;
//"被调用函数"(命名体现了通用型的思想)
DListRet dlist_foreach(DList *thiz, DListVisitFunc visit, void *ctx){
DListRet ret=DLIST_RET_OK;
DListNode *iter=thiz->first;
while(iter!=NULL){
ret=visit(ctx,iter->data);
if(ret==DLIST_RET_STOP)
break;
iter=iter->next;
}
return ret;
}
//"回调函数",由调用者提供
DListRet dlist_max(void *ctx, void *data){
int *temp=ctx;
if((int)data>*temp){
*temp=(int)data;
}
return DLIST_RET_OK;
}
DListRet dlist_sum(void *ctx, void *data){
long long* temp=ctx;
*temp+=(int)data;
//printf("%d",(int)data);
return DLIST_RET_OK;
}
DListRet dlist_print(void *ctx, void *data){
printf("%d\t",(int)data);
return DLIST_RET_OK;
}
int main(){
//初始化双向链表
DListNode *a=(DListNode *)malloc(sizeof(DListNode));
DListNode *b=(DListNode *)malloc(sizeof(DListNode));
DListNode *c=(DListNode *)malloc(sizeof(DListNode));
a->data=(void *)2;
b->data=(void *)5;
c->data=(void *)3;
a->next=b;
a->prev=NULL;
b->next=c;
b->prev=a;
c->prev=b;
c->next=NULL;
DList *list=(DList *)malloc(sizeof(DList));
list->first=a;
//调用
int max=-1;
dlist_foreach(list, dlist_max, &max);
printf("%d\n", max);
long long sum=0;
dlist_foreach(list, dlist_sum, &sum);
printf("%ld\n", sum);
dlist_foreach(list, dlist_print, NULL);
return 0;
}
分享到:
相关推荐
这是一个双向链表,非常的可以。主要有3个头文件,10多个实现文件,还有一个主函数文件,希望大家多多支持!
通用双向链表,数据类型通用化。更高级的做法是节点话,链表节点中剥离数据,这也是软件工程中常用方法。
双向链表
http://msdn.microsoft.com/en-us/library/95z04bas(v=VS.71).aspx 双向链表
建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。) Input 第一行:双向表的长度; 第二行:链表中的数据元素。 Output 输出双向链表中...
实现了通用的双向链表的所有操作,可以适用于各种数据结构,并配备了内存检漏算法,保证内存不泄露。
自己写的通用双向链表,链表数据存储不区分类型,存储均为指针,有使用事例。现在已实现的功能有链表的创建,插入(前后均可实现),单节点删除,链表...所有的删除、查找条件均使用回调函数,实现不同类型的通用存储。
双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
用C语言实现的通用双向链表,格式代码都比较漂亮
定义了线性表的抽象类,以及双向链表类及其结点类,实现双向链表的基本功能,还进一步应用到一元多项式的储存、加法和乘法,里面包含了项目文件,测试文件以及报告文件(一元多项式实现的思路)。
定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...
题目:设计一个带表头的双向链表(链表中数据的具体类型可以随意) 提供以下方法: (1)insert:在某个位置插入对象; (2)insert:在链表的最后插入对象; (3)delete:在某个位置删除对象; (4)delete:删除...
数组和链表——精选推荐 数组和链表.pdf
详细的介绍了Linux内核中使用的最频繁的双向链表
二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。
将双向链表的基本操作写成了一套通用程序,不管你的链表长什么样子,都可以使用它来帮你完成节点的插入、删除等操作,大幅度减轻编程工作量,让你可以将注意力集中到链表中其他的数据成员的操作上。 该程序的详细...
一种支持类模版和函数模版的C++双向链表,实现了各种排序算法(排序原则可定制),包含学生信息的使用示例(VC 6.0、VS2008).
数据结构 双向链表存储 附带基础处理函数 附带测试函数
2.用双向链表做数据结构,编写一个通信录管理系统。本系统应完成以下几方面的功能。 输入信息——enter(); 显示信息——display(); 查找以姓名作为关键字——search(); 删除信息——delete(); 存盘——...