清华版的数据结构
严蔚敏出版的那本数据结构可能真是传说中的那么好,但我觉得也不太适合初学者,看得我都有点头晕了,而且也没有具体的例子,好像一开始的那段
//----------线性表的动态分配顺序存储结构-----------------
#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????? 首先这里的LIST_INIT_SIZE100 // 线性表存储空间的初始分配量
LISTINCREMENT 10 // 线性表存储空间的分配增量
是怎么回事呢?好像数组一开始的分配大小吗?
然后他是定义一个指针类型的 *elem 引用它里面的元素时可以这样写的吗 L.elem?????
上面两个是宏定义,也就是直接文本替换,即代表,当前文件中所有的
LISTINCREMENT 就完完全全和数字 10 一样.
这样做的原因是方便之后修改等操作.假设你代码里用了大量的10,则直接改下宏定义,就可以全部改掉了,省得一个一个修改.
下面的写法是可以的. 其实我是想说可以这样写吗 L.elem
LISTINCREMENT 10
i当需要增量时就 L.listsize+=LISTINCREMENT 再通过 realloc 改变原来的 L.elem
这里还是不太懂 這個如果改成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中的儲存器 STL中的儲存器 又是什么..... STL中的儲存器有很多種,全部也是用來存資料,簡單的當成高階的陣列也可以,還有類似array["item1"]的用法,很多不同的 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]