免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17721 | 回复: 84
打印 上一主题 下一主题

大家在编程过程中有没有自己比较得意的代码,共享一下,我先来我的一个。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-16 14:28 |只看该作者 |倒序浏览
通用的释放单链表的函数:
在我的工作中好多地方都要用到节点类型各式各样的单链表,开始的时候每种类型的链表都要写一个释放内存的函数,
例如:

  1.                LINKTYPE    * p,*q;   
  2.                 p=XXX;/*XXX 为需要释放的LINKTYPE类型的单链表*/            
  3.                 while(p)
  4.         {
  5.                 q=p->next;
  6.                 free(p);
  7.                 p=q;
  8.         }
复制代码

这种实现代码代码虽然可以通过copy and paste达到重用的目的,但由于LINKTYPE不尽相同,所以在实现的时候还是感觉比较麻烦。后来仔细想了一下可以写成通用的释放函数。
的确可以。
代码如下:
  1. /* ==========================================================
  2. *     开发人员:呵呵
  3. *     编写时间:2006-10-7
  4. *     函数名称:free_nextbegin_link
  5. *     参数说明:
  6. *     功能说明:释放next做为链表节点结构的第一个成员的链表的内存
  7.           链表的结构必需是:
  8.           typedef struct linktype_s
  9.           {
  10.              struct linktype_s * next;  
  11.              ......
  12.              ......            
  13.           }LINKTYPE;
  14. */
  15. void free_nextbegin_link(void * link)
  16. {
  17.         long next;
  18.         if(link==NULL) return;
  19.         while(link!=NULL)
  20.         {
  21.                 next=*((long*)link);
  22.                 free(link);       
  23.                 link=(void*) next;                               
  24.         }
  25.         return;
  26. }

  27. /* ==========================================================
  28. *     开发人员:呵呵
  29. *     编写时间:2006-10-7
  30. *     函数名称:free_nextbegin_link
  31. *     参数说明:
  32.                         link          :需要释放的链表的头节点
  33.                         nodesize  :每个节点的大小
  34. *     功能说明:释放next做为链表节点结构的最后一个成员的链表的内存
  35.           链表的结构必需是:
  36.           typedef struct linktype_s
  37.           {
  38.              ......
  39.              ......            
  40.                 struct linktype_s * next;  
  41.           }LINKTYPE;
  42. */
  43. void free_nextend_link(void * link,size_t nodesize)
  44. {
  45.         char *next;
  46.                 void * p ;
  47.         if(link==NULL) return;
  48.         while(link!=NULL)
  49.         {
  50.                 next=(char*)link+(nodesize-sizeof(long*));
  51.                            p=(void*)(*((long*)next));
  52.                 free(link);
  53.                 link=p;                       
  54.         }
  55.         return;
  56. }
复制代码




类似的可以通过得到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;
        }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i < 4; i ++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((ip[i] > 255) || (ip[i] < 0))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;
}


[ 本帖最后由 高峰 于 2007-8-17 09:14 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-16 14:35 |只看该作者
都很多年不用链表了:)

论坛徽章:
0
3 [报告]
发表于 2007-08-16 14:37 |只看该作者
LZ的代码是懂点数据结构都会的,如果是C++的话直接在类中添加自销毁的函数甚至更好。
在C中更方便的方法是把函数的指针添加为链表成员,初始化赋值free_nextend_link()的地址给这个指针然后需要销毁时调用XXX.free_nextend_link(),XXX为链表的首节点,当然,如果XXX不是链表的首节点,也可以方便的销毁任意节点后的所有节点

论坛徽章:
0
4 [报告]
发表于 2007-08-16 14:39 |只看该作者
我主要是做电信业务的,用POR*C,数据量很大,一般用链表和平衡二叉树结合起来作为核心数据结构。链表用得还是比较多。

论坛徽章:
0
5 [报告]
发表于 2007-08-16 14:43 |只看该作者
原帖由 ivhb 于 2007-8-16 14:35 发表
都很多年不用链表了:)

很多年不用不代表可以不学。而且真的很多年不用吗??或许LZ的意思是现在的数据库用的是其他的数据管理方法,比如双链表,二叉树,等,但相对于双链表和二叉树,链表还是比较基础的......至少周游链表是要比周游二叉树容易得多的

论坛徽章:
0
6 [报告]
发表于 2007-08-16 14:44 |只看该作者
LZ的代码是懂点数据结构都会的,如果是C++的话直接在类中添加自销毁的函数甚至更好。
在C中更方便的方法是把函数的指针添加为链表成员,初始化赋值free_nextend_link()的地址给这个指针然后需要销毁时调用XXX.free_nextend_link(),XXX为链表的首节点,当然,如果XXX不是链表的首节点,也可以方便的销毁任意节点后的所有节点


你这个有点像OOC了,也是好主意,不过多了一个成员,没有必要。呵呵

论坛徽章:
0
7 [报告]
发表于 2007-08-16 14:46 |只看该作者
原帖由 thynson 于 2007-8-15 22:43 发表

很多年不用不代表可以不学。而且真的很多年不用吗??或许LZ的意思是现在的数据库用的是其他的数据管理方法,比如双链表,二叉树,等,但相对于双链表和二叉树,链表还是比较基础的......至少周游链表是要比周 ...


可能楼上的(我指ivhb)是用C++。ps,这和数据库没啥关系吧。

[ 本帖最后由 emacsnw 于 2007-8-15 22:48 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-08-16 14:47 |只看该作者
原帖由 高峰 于 2007-8-16 14:44 发表


你这个有点像OOC了,也是好主意,不过多了一个成员,没有必要。呵呵

看来LZ是以空间为主要考虑对象的程序员(或的公司的程序员)

论坛徽章:
0
9 [报告]
发表于 2007-08-16 14:51 |只看该作者
看来LZ是以空间为主要考虑对象的程序员(或的公司的程序员)


熟悉电信业务的人应该有所了解,空间和效率同样重要。
一个程序占几G内存的事情很常见,能省一点是一点。呵呵。

论坛徽章:
0
10 [报告]
发表于 2007-08-16 14:57 |只看该作者
释放单链表的难点不是数据结构,而是“通用性”
我觉得
这个通用性的实现我还是花了一点时间才搞成功的。
呵呵

欢迎大家跟帖共享得意代码啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP