幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2400|回复: 6

[通用编程] 清华版的数据结构

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-8-5 16:34:31 | 显示全部楼层 |阅读模式
严蔚敏出版的那本数据结构可能真是传说中的那么好,但我觉得也不太适合初学者,[s:6]看得我都有点头晕了,而且也没有具体的例子,
好像一开始的那段
//----------线性表的动态分配顺序存储结构-----------------
#define  LIST_INIT_SIZE   100        // 线性表存储空间的初始分配量
#define  LISTINCREMENT    10      // 线性表存储空间的分配增量
typedef   struct
{
    ElemType    *elem;
   int                    length;
    int                   listsize;
}SqList;

---------------------初始化-----------------------------
Status InitLIst_Sq(SqlList  &L)
{
    L.elem=(ElemType  *) malloc (LIST_INIT_SIZE *sizeof(ElemType));
    if(! L.elem)  exit(voerflow);
    L.length=0;
    L.listsize=LIST_INT_SIZE;
    return   ok;
}

首先这里的LIST_INIT_SIZE   100        // 线性表存储空间的初始分配量
LISTINCREMENT    10      // 线性表存储空间的分配增量
是怎么回事呢?好像数组一开始的分配大小吗?
然后他是定义一个指针类型的 *elem     引用它里面的元素时可以这样写的吗 L.elem?????
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-8-6 13:50:41 | 显示全部楼层
首先这里的LIST_INIT_SIZE  100        // 线性表存储空间的初始分配量
LISTINCREMENT    10      // 线性表存储空间的分配增量
是怎么回事呢?好像数组一开始的分配大小吗?
然后他是定义一个指针类型的 *elem    引用它里面的元素时可以这样写的吗 L.elem?????

上面两个是宏定义,也就是直接文本替换,即代表,当前文件中所有的
LISTINCREMENT    就完完全全和数字 10 一样.
这样做的原因是方便之后修改等操作.假设你代码里用了大量的10,则直接改下宏定义,就可以全部改掉了,省得一个一个修改.
下面的写法是可以的.
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-8-7 01:05:22 | 显示全部楼层
其实我是想说可以这样写吗
  1. L.elem[i]  
复制代码
LISTINCREMENT   10
i当需要增量时就 L.listsize+=LISTINCREMENT   再通过 realloc 改变原来的 L.elem
这里还是不太懂 [s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-8-8 10:56:05 | 显示全部楼层
這個如果改成new關鍵字比較易明白
L.elem=(ElemType  *) malloc (LIST_INIT_SIZE *sizeof(ElemType));
==>
L.elem=new ElemType[ LIST_INIT_SIZE];
而#define  LIST_INIT_SIZE  100  再修改成
L.elem=new ElemType[ 100];
很容易明白,new ElemType[ 100] 解成閇一個新的空間,放著一個大小為100,格式為ElemType的陣例
而L.elem便作為一個指標指著這個陣例用以存取

而這個struct只是一個可變大小的ElemType陣列
如果august認為還是太難理解的話可以試著直接使用STL中的儲存器

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-8-8 11:55:23 | 显示全部楼层
STL中的儲存器 又是什么..... [s:6]  [s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-8-8 13:44:28 | 显示全部楼层
STL中的儲存器有很多種,全部也是用來存資料,簡單的當成高階的陣列也可以,還有類似array["item1"]的用法,很多不同的

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

50

主题

994

帖子

6699

积分

管理员

爱干啥干啥!

Rank: 9Rank: 9Rank: 9

积分
6699
发表于 2007-8-9 01:02:38 | 显示全部楼层
orz...这样写代码真的很花。定义指针的话,应该和变量名帖在一起还是和类型贴在有很多争议。
  1. 比如写成
  2. Type*   var;
  3. 很清晰,var是名字,Type*是类型,表示Type的指针。所以就不会出现lz的误会,觉得*var是名字。
  4. 但是假如遇到这种情况:
  5. Type*    var1, var2;
  6. 就会出现问题,实质上只有var1是指针类型,var2只是普通的Type类型。
  7. 因此才会出现lz文中的那种定义:
  8. Type     *var1, var2;
  9. 这样看起来就明确了,var1和var2不是同一种。但是又会带来最初的问题……
  10. 解决方案很简单,指针要紧贴类型,每行只定义一个变量:
  11. Type*      var1;
  12. Type        var2;
  13. 搞定了~~:)
  14. 其实这样最清晰,也就是用typedef,虽然比较浪费字符:
  15. typedef    Type*   PType;
  16. PType var1;
  17. Type var2;
  18. 注意如果这个时候var2连写在后面,var2也会变成指针类型。因为PType是一个整体。
  19. PType var1, var2; // 这时var1,var2都是指针!!
复制代码

推荐lz找本纯粹一些的数据结构书来看。比如一些算法书前面多少会讲一些基本的数据结构,写得代码都很精简的。或者那种直接用伪代码的书,看起来会简单一些。

关于用STL容器……最好还是先把基础的数据结构知识了解过再用STL,至少“栈、队列、链表、树”这些基本的结构应该掌握下:)

不了解这些不妨碍你使用STL,但是妨碍你正确的思考。

“放下屠刀,立地成佛” 故应先杀生,然后再成佛。

(\\_/) (-_-) ()+() this is bunny priest.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-4 06:21 , Processed in 0.031028 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表