- 论坛徽章:
- 0
|
通用的释放单链表的函数:
在我的工作中好多地方都要用到节点类型各式各样的单链表,开始的时候每种类型的链表都要写一个释放内存的函数,
例如:
- LINKTYPE * p,*q;
- p=XXX;/*XXX 为需要释放的LINKTYPE类型的单链表*/
- while(p)
- {
- q=p->next;
- free(p);
- p=q;
- }
复制代码
这种实现代码代码虽然可以通过copy and paste达到重用的目的,但由于LINKTYPE不尽相同,所以在实现的时候还是感觉比较麻烦。后来仔细想了一下可以写成通用的释放函数。
的确可以。
代码如下:
- /* ==========================================================
- * 开发人员:呵呵
- * 编写时间:2006-10-7
- * 函数名称:free_nextbegin_link
- * 参数说明:
- * 功能说明:释放next做为链表节点结构的第一个成员的链表的内存
- 链表的结构必需是:
- typedef struct linktype_s
- {
- struct linktype_s * next;
- ......
- ......
- }LINKTYPE;
- */
- void free_nextbegin_link(void * link)
- {
- long next;
- if(link==NULL) return;
- while(link!=NULL)
- {
- next=*((long*)link);
- free(link);
- link=(void*) next;
- }
- return;
- }
- /* ==========================================================
- * 开发人员:呵呵
- * 编写时间:2006-10-7
- * 函数名称:free_nextbegin_link
- * 参数说明:
- link :需要释放的链表的头节点
- nodesize :每个节点的大小
- * 功能说明:释放next做为链表节点结构的最后一个成员的链表的内存
- 链表的结构必需是:
- typedef struct linktype_s
- {
- ......
- ......
- struct linktype_s * next;
- }LINKTYPE;
- */
- void free_nextend_link(void * link,size_t nodesize)
- {
- char *next;
- void * p ;
- if(link==NULL) return;
- while(link!=NULL)
- {
- next=(char*)link+(nodesize-sizeof(long*));
- p=(void*)(*((long*)next));
- free(link);
- link=p;
- }
- return;
- }
复制代码
类似的可以通过得到next的偏移来实现next位置不定的释放单链表的函数。这个就留给大家思考啦,嘿嘿。
欢迎大家指正,同时希望大家把比较得意的代码拿来显摆显摆,呵呵。互相学习提高。
经过converse版主的指点,代码有所改动.在此多谢converse 了
下面是NewCore的检查IP地址是否有效的代码,挺好用。sscanf用得好!:lol:
/**
*\brief
*check ip address
*/
BOOL IsValidIP(char * _ipaddr)
{
int i;
int ip[4];
char buf[16];
/* ip address */
memset(buf, 0, sizeof(buf));
sscanf(_ipaddr, "%d.%d.%d.%d%s", &ip[0], &ip[1], &ip[2], &ip[3], buf);
if(buf[0] != 0)
{
return FALSE;
}
for(i = 0; i < 4; i ++)
{
if((ip[i] > 255) || (ip[i] < 0))
{
return FALSE;
}
}
return TRUE;
} |
[ 本帖最后由 高峰 于 2007-8-17 09:14 编辑 ] |
|