Impossible is nothing  
  爱过知情重醉过知酒浓   花开花谢终是空   缘份不停留像春风来又走   女人如花花似梦
公告
日历
<2022年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
统计
  • 随笔 - 8
  • 文章 - 91
  • 评论 - 16
  • 引用 - 0

导航

常用链接

留言簿(4)

随笔分类(4)

随笔档案(8)

文章分类(77)

文章档案(91)

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在你类中的虚函数中,供子类使用。如:

class Links
{
public:
    Links* back;
    Links* forword;

    virtual Add(){ ... };
    virtual Del(){ ... };
    virtual Ins(){ ... };
    virtual Print() =0;
    ....

};

于是对于特定的数据结构我们可以:
class mylinks : public Links
{
public:
    char* myname;
    char sex;
    int  age;
    ...
    virtual Print(){ .... }

};
对其操作时都可以使用你类的泛型算法。


在C中,该如何做呢?我们用C中的指针和强制类型转可以做到。

下面是我总结出来的一个小的程序,体现了用指针的弹性来实现这一继承的效果:
(我在Liniux下的GCC调试通过)

=======================================

 1#include <stdio.h>
 2
 3/* 双向链表 (类似于父类)*/
 4typedef struct hLinks{
 5   struct hLinks *bwLink;
 6   struct hLinks *fwLink;
 7}
 hLinks;
 8
 9
10/*
11 * 一个使用双向链表的结构
12 *     (类似于子类)
13 */

14typedef struct hEnt{
15   hLinks links;
16   int hData;
17   char key[10];
18}
 hEnt;
19
20
21/*
22 *  双向链插入泛型算法 (类似于父数中的成员函数)
23 */

24Insert( hLinks* elem, hLinks *dest )
25{
26   if ( !elem || !dest ) return;
27
28   elem->bwLink = dest->bwLink;
29   elem->fwLink = dest;
30   dest->bwLink->fwLink = elem;
31   dest->bwLink = elem;
32}

33
34
35/*
36 *  打印 (类似于子类重载父类的成员函数)
37 */

38PrintLink( hLinks *h )
39{
40    hEnt *p ;
41
42    for( p = ( hEnt* ) h->fwLink;     /*  <-----------把hLink再转回来  */
43         p != ( hEnt* ) h;
44         p = ( hEnt* )( (hLinks*)p )->fwLink )
45    {
46       printf("hData=[%d], key=[%s]\n", p->hData, p->key);
47    }

48}

49
50 
51
52main()
53{
54   hLinks head;
55   hEnt a[4];
56   int i;
57
58   head.bwLink = &head;
59   head.fwLink = &head;
60
61   for(i=0;i<4;i++)
62   {
63      a[i].hData = i*10;
64      sprintf(a[i].key,"id=%d", i);
65
66      /*  使用泛型算法构造双向链  */ 
67      Insert( (hLinks *&a[i], (hLinks *&head ); /*   <-----注意这个强制转换  */
68   }

69
70   PrintLink( (hLinks *&head ); /*   <-------也注意这个强制转换  */
71}

72
73

posted on 2006-03-16 15:04 笑笑生 阅读(454) 评论(0)  编辑 收藏 引用 所属分类: C++语言

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © 笑笑生 Powered by: 博客园 模板提供:沪江博客