Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4471091
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-05-13 15:30:54

如何编写一个通用的链表??

   存值还是存指针???

   1. 新手常见的做法是定义一个抽象数据类型,需要存什么,就定义什么.
      在前面的 v2-0 链表定义中,我也是怎么定义的。。其实错了。。我还是个新手
如下:

  1. typedef char ElemType;
  2. struct _list
  3. {
  4.     ElemType data;
  5.     struct _list *prior;
  6.     struct _list *next;
  7.     int length; //获取链表结点数
  8. };
  
    上面的链表算不上通用链表,因为你在存放整数时编译一次,存放字符串时,重新定义ElemType再编译一次,存放其他类型同样要重复这个过程。

 
    2. 存指针
       只保存对象的指针,存取效率高,是C语言中常见的做法。在存放整数时,可以把void * 强制转换成整数使用,以避免内存分配
    
       修改代码 如下:

  1. typedef struct _list
  2. {
  3.     void *data;  //设置成指针类型
  4.     struct _list *prior;
  5.     struct _list *next;
  6.     int length; //获取链表结点数
  7. }LIST;

       在main函数中,强制转换成 char 类型数据
  1.     insert_elem(list, 1, &ch1);
  2.     insert_elem(list, 1, &ch2);
  3.     insert_elem(list, 3, &ch3);
  4.    
  5.     printf("1th data is %c\n",*((char *)list->next->data));

*((char *)list->next->data) 进行说明

  1. list->next->data  是 void * data 类型,是void 类型地址
  
  2. (char *)
list->next->data
     强制将 void * 类型 转换成 char * 类型 ,表示这个指针指向的地址的数据的类型是 char 型,

  3.
*((char *)list->next->data),取指针指向的地址的内容


对自己修改的 双链表代码 v3-0:
 v3-0.rar  

阅读(1028) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~