今天我来日经贴,还是malloc的问题……
在《数据结构与算法分析》中看到的实现
第一个例子:(开放地址散列表)
结构体定义
- C/C++ code
struct HashEntry{ ElementType Element; enum KindOfEntry Info;};typedef struct HashEntry Cell;struct HashTbl{ int TableSize; Cell *TheCells;};初始化
- C/C++ code
HashTable InitializeTable( int TableSize ){ HashTable H; int i; if ( TableSize < MinTableSize ) { printf("Table size too samll!\n"); return NULL; } if ( (H = malloc(sizeof(struct HashTbl))) == NULL ) { perror("OUT OF SPACE!"); return NULL; } H->TableSize = TableSize; for ( i = 0; i < TableSize; i++ ) { H->TheCells[i].Info = Empty; } return H;}对于H->TheCells[i],没有分配内存就可以直接使用?
再看另一个例子(分离连接散列表)
结构体定义
- C/C++ code
struct ListNode{ ElementType Element; Position Next;};typedef Position List;struct HashTbl{ int TableSize; List *TheLists;};初始化
- C/C++ code
HashTable InitializeTable( int TableSize ){ HashTable H; int i; if ( TableSize < MinTableSize ) { printf("Table Size Too Small!\n"); return NULL; } if ( (H = malloc(sizeof(struct HashTbl))) == NULL ) { perror("OUT OF SPACE!"); return NULL; }// H->TableSize = NextPrime( TableSize );// 素数大小 H->TableSize = TableSize; if ( (H->TheLists = malloc(sizeof(List)*H->TableSize)) == NULL) { perror("OUT OF SPACE!"); return NULL; } for (i = 0; i < H->TableSize; i++) { if ( (H->TheLists[i] = malloc(sizeof(struct ListNode))) == NULL ) { perror("OUT OF SPACE!"); return NULL; } H->TheLists[i]->Next = NULL; } return H;}这个例子里面又十分谨慎地进行了malloc,看得好糊涂,求指点!!!
[解决办法]
第一个例子用法错了,运行大概会直接出错
[解决办法]
嗯,第一个程序肯定会报错的。
第二个问题是:Position是什么??由于不知道Position是什么,导致了我不知道你的 *TheLists是什么,从而导致了不知道你的H->TheLists[i] = malloc(sizeof(struct ListNode))是否正确了。
[解决办法]
扔了这本书吧,除了有错,数据结构的实现也是很垃圾的,从H->TheLists = malloc(sizeof(List)*H->TableSize)一行就看得出来,还没存数据就给每个桶分配了一个静态NODE,根本没法用,浪费,设计烂,和之后插入的单一动态NODE格格不入,一看就是某导师让俩半吊子学生写的书。