A C library for some personal convenient functions and components.
单链表相关库。
DSList * head
DSList * DSList_init ( void )
例:
初始化上一步中的链表。
head = DSList_init ();
DSList * DSList_create_node ( void * data);
该函数接收一个void类型的指针,该指针指向我们自己的需要插入到链表中的数据空间。
函数返回新创建节点的地址。
例:
假设我们的数据存放在
struct data {
char username[100];
int password;
}
创建一个节点,并将我们的数据放置其中。
DSList * node = NULL;
struct data * payload = (struct data *) malloc (sizeof (struct data));
strcpy (payload->username, "Douglas");
payload->password = 123456;
node = DSList_create_node ((void *)payload);
DSList * DSList_append (DSList * list, DSList * node);
将3) 创建一个链表节点中创建的节点node添加到链表list尾部。
函数返回新的链表头。
例:
我们将 node 节点插入到 head 的链表的最后面。
head = DSList_append (head, node);
DSList * DSList_prepend (DSList *, DSList *);
将3) 创建一个链表节点中创建的节点node添加到链表list的头部。
函数返回新的链表头。
例:
我们将 node 节点插入到 head 的链表的最前面。
head = DSList_prepend (head, node);
DSList * DSList_remove (DSList * list, int func (void *, void *), void * args, DSList ** node);
将每个node中保存的数据作为参数传送给func函数,该函数根据传入的数据判断该节点是不是保存了需要的数据,如果是的话返回1,否则返回0。
args 也会作为第二个参数传给func,其中可以保存用户需要的数据。
该函数返回后会将node填充为移除的节点的地址,如果node为NULL的话,则忽略。
该函数不会释放node所占用的内存空间。
函数返回新的链表头。
例:
我们将 node 节点从 head 链表中移除。
为了选出我们需要的节点,需要定义find函数。如果向该函数传入的数据满足条件则函数返回1,否则返回0。
int find (void * payload) {
struct data * py = (struct data *) payload;
if (strcmp (py->username, "Douglas"))
return 0;
else
return 1;
}
进行移除操作:
head = DSList_remove (head, find, node);
DSList * DSList_delete (DSList * list, int func (void *, void *), void * args, void ** payload);
将每个node中保存的数据作为参数传送给func函数,该函数根据传入的数据判断该节点是不是保存了需要的数据,如果是的话返回1,否则返回0。
args 也会作为第二个参数传给func,其中可以保存用户需要的数据。
该函数返回后会将payload填充为移除的节点中数据的地址,如果payload为NULL的话,则忽略。
函数返回新的链表头。
例:
我们将 node 节点从 head 链表中删除。
为了选出我们需要的节点,需要定义find函数。如果向该函数传入的数据满足条件则函数返回1,否则返回0。
int find (void * payload) {
struct data * py = (struct data *) payload;
if (strcmp (py->username, "Douglas"))
return 0;
else
return 1;
}
进行删除操作:
head = DSList_delete (head, find, node);
void DSList_traverse (DSList * list, int func (void *, void *), void * args);
将func函数应用到list中的每一个节点上。
args 也会作为第二个参数传给func,其中可以保存用户需要的数据。
例:
对链表中的每个元素应用如下的打印函数。
int print (void * payload) {
struct data * py = (struct data *) payload;
printf ("username = %s\n, password = %d\n", py->username, py->password);
}
使用该函数:
DSList_traverse (head, print);
DSList * DSList_search (DSList * list, int func (void *, void *), void * args);
在链表list中搜索满足条件func的节点。
args 也会作为第二个参数传给func,其中可以保存用户需要的数据。
如果搜索到则返回节点地址,否则返回NULL。
例:
将满足 find 函数的节点返回。
为了选出我们需要的节点,需要定义find函数。如果向该函数传入的数据满足条件则函数返回1,否则返回0。
int find (void * payload) {
struct data * py = (struct data *) payload;
if (strcmp (py->username, "Douglas"))
return 0;
else
return 1;
}
进行搜索操作:
head = DSList_search (head, find, node);
void * DSList_destory_node (DSList *);
释放node所占用的空间。
返回node中保存的数据的地址。
例:
释放节点所占用的内存,并返回数据地址。
data = DSList_destory_node (node);
void * DSList_strip (DSList *);
提取node节点中的数据的指针。
返回node中保存数据的地址。
例:
返回节点内所存数据的地址。
data = DSList_strip (node);
void DFprint_memory_default (void * start, int len);
用十六进制打印以start开头的len个字节。
int DFprint_memory (void * start, char * format, int ele_per_line);
打印内存以start开始,每行打印ele_per_line个。
format制定需要打印的格式,该格式与GDB中x打印命令相同,但是不支持f,a,s,i打印类型。
int DFsocket_create_server (int type, const struct sockaddr * addr, socklen_t alen, int qlen);
typer指定使用协议的协议族,例如AF_INET或者AF_UNIX。
addr为对应存放地址的结构体指针。
ale为addr结构体的有效长度。
qlen为listen时的挂起队列长度。