- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
作为练习(我是一名学生),我在 C 中实现了一个基本的 string
到 int
哈希表。我(我认为)一切正常, 打印表格函数
除外。它开始工作,但 Windows 在打印出一个存储桶的三个条目后说 “hashtable.exe 已停止工作”,我知道其他的是有效的,因为我可以在命令提示符下检索它们的值我有的东西。这是我的代码,任何建议都很重要:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const char ESC_STRING[] = "zzzz";
struct a_container {
char *string;
int value;
struct a_container *next;
};
typedef struct a_container Container;
struct c_list {
Container **arr;
int size;
int bits;
};
typedef struct c_list Table;
void print_entry(Container *c) {
printf("%s%s%d", c -> string, ", ", c -> value);
}
void print_table(Table *t) {
Container *e;
int i;
int length = t -> size;
printf("%d\n", length);
for(i = 0; i < length; i++) {
printf("%d\n", i);
if(t -> arr[i] == NULL) printf("%s\n", "Null bucket.");
for(e = t -> arr[i]; e != NULL && e -> string != NULL; e = e -> next) {
print_entry(e);
}
}
}
Container *make_cont() {
Container *new;
new = malloc(sizeof(Container));
if(new == NULL) return NULL;
new -> next = NULL;
return new;
}
Container *make_entry(char *key, int value) {
Container *n = make_cont();
n -> string = key;
n -> value = value;
return n;
}
Table *make_table(int size) {
Table *tab = NULL;
int i;
int j = 2 << (size - 1);
if(size < 1) return NULL;
tab = malloc(sizeof(Table));
tab -> arr = malloc(sizeof(Container) * j);
for(i = 0; i < size; i++) {
tab -> arr[i] = NULL;
}
tab -> size = j;
tab -> bits = size;
return tab;
}
void associate(Table *hashtable, char *key, int value) {
int index = hash_index(hashtable, key, hashtable -> bits);
Container *e = NULL;
Container *n = NULL;
if(hashtable -> arr[index] == NULL) {
e = make_entry(key, value);
hashtable -> arr[index] = e;
return;
}
else {
e = hashtable -> arr[index];
n = make_entry(key, value);
hashtable -> arr[index] = n;
n -> next = e;
}
}
int retrieve(Table *hashtable, char *look) {
int index = hash_index(hashtable, look, hashtable -> bits);
Container *e = NULL;
//if(hashtable -> arr[index] == NULL) exit(1);
e = hashtable -> arr[index];
while(e != NULL && e -> string != NULL && strcmp(look, e -> string) > 0) {
e = e -> next;
}
if(e == NULL || e -> string == NULL || strcmp(look, e -> string) != 0) {
exit(1);
} else {
return e -> value;
}
}
//djb2 algorithm by dan bernstein
//http://www.cse.yorku.ca/~oz/hash.html
unsigned long hash_code(char *key) {
unsigned long hash = 5381;
int c;
while(c = *key++) {
hash = ((hash << 5) + hash) + c;
}
return hash;
}
int hash_index(Table *hashtable, char *query, int bits) {
unsigned long hashCode = hash_code(query);
unsigned int fold = 0;
unsigned int h;
int trim = 2 << (bits - 1);
int mask = trim - 1;
for(h = hashCode; h != 0; h >>= bits) {
fold ^= h;
}
fold &= mask;
return fold;
}
int main() {
char *i;
Table *hashtable = make_table(3);
associate(hashtable, "Erica", 323);
associate(hashtable, "Kitty", 18);
associate(hashtable, "Dawg", 3);
associate(hashtable, "Dahhhhhhg", 43);
associate(hashtable, "Kat", 7);
//print_table(hashtable);
while(1) {
printf("%s", "Look something up: ");
scanf("%s", i);
if(strcmp(i, ESC_STRING) == 0) break;
printf("%d\n", retrieve(hashtable, i));
}
return 0;
}
最佳答案
在为变量赋值之前,您不能使用它的值。在 main
中,您将 i
的值传递给 scanf
,但您尚未为其赋值。因此,您向 scanf
传递了一个垃圾地址,这会导致程序在 scanf
尝试在该无意义位置存储内容时崩溃。
关于c - 哈希表打印 "Stops Working",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20601948/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!