august 发表于 2007-8-5 16:34:31

清华版的数据结构

严蔚敏出版的那本数据结构可能真是传说中的那么好,但我觉得也不太适合初学者,看得我都有点头晕了,而且也没有具体的例子,
好像一开始的那段
//----------线性表的动态分配顺序存储结构-----------------
#defineLIST_INIT_SIZE   100      // 线性表存储空间的初始分配量
#defineLISTINCREMENT    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?????

duzhi5368 发表于 2007-8-6 13:50:41

首先这里的LIST_INIT_SIZE100      // 线性表存储空间的初始分配量
LISTINCREMENT    10      // 线性表存储空间的分配增量
是怎么回事呢?好像数组一开始的分配大小吗?
然后他是定义一个指针类型的 *elem    引用它里面的元素时可以这样写的吗 L.elem?????

上面两个是宏定义,也就是直接文本替换,即代表,当前文件中所有的
LISTINCREMENT    就完完全全和数字 10 一样.
这样做的原因是方便之后修改等操作.假设你代码里用了大量的10,则直接改下宏定义,就可以全部改掉了,省得一个一个修改.
下面的写法是可以的.

august 发表于 2007-8-7 01:05:22

其实我是想说可以这样写吗 L.elem
LISTINCREMENT   10
i当需要增量时就 L.listsize+=LISTINCREMENT   再通过 realloc 改变原来的 L.elem
这里还是不太懂

coolpay64 发表于 2007-8-8 10:56:05

這個如果改成new關鍵字比較易明白
L.elem=(ElemType*) malloc (LIST_INIT_SIZE *sizeof(ElemType));
==>
L.elem=new ElemType[ LIST_INIT_SIZE];
而#defineLIST_INIT_SIZE100再修改成
L.elem=new ElemType[ 100];
很容易明白,new ElemType[ 100] 解成閇一個新的空間,放著一個大小為100,格式為ElemType的陣例
而L.elem便作為一個指標指著這個陣例用以存取

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

august 发表于 2007-8-8 11:55:23

STL中的儲存器 又是什么.....

coolpay64 发表于 2007-8-8 13:44:28

STL中的儲存器有很多種,全部也是用來存資料,簡單的當成高階的陣列也可以,還有類似array["item1"]的用法,很多不同的

FantasyDR 发表于 2007-8-9 01:02:38

orz...这样写代码真的很花。定义指针的话,应该和变量名帖在一起还是和类型贴在有很多争议。


比如写成
Type*   var;
很清晰,var是名字,Type*是类型,表示Type的指针。所以就不会出现lz的误会,觉得*var是名字。

但是假如遇到这种情况:
Type*    var1, var2;
就会出现问题,实质上只有var1是指针类型,var2只是普通的Type类型。

因此才会出现lz文中的那种定义:
Type   *var1, var2;
这样看起来就明确了,var1和var2不是同一种。但是又会带来最初的问题……

解决方案很简单,指针要紧贴类型,每行只定义一个变量:
Type*      var1;
Type      var2;

搞定了~~:)

其实这样最清晰,也就是用typedef,虽然比较浪费字符:
typedef    Type*   PType;
PType var1;
Type var2;

注意如果这个时候var2连写在后面,var2也会变成指针类型。因为PType是一个整体。
PType var1, var2; // 这时var1,var2都是指针!!


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

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

不了解这些不妨碍你使用STL,但是妨碍你正确的思考。
页: [1]
查看完整版本: 清华版的数据结构