我有一個鏈表和每個節點中的散列表。哈希表由一個指向結構體的指針數組實現。整個管理是通過一個全局靜態指針指向鏈表來完成的。C - 指針結構指針數組指針
- 我改變了一些問題!現在問題更加集中。
,並插入功能,使代碼更短,我給你
temp = cur_table->symbols_table[entry];
,但我看到,臨時變空所有的時間。 我不明白爲什麼會發生這種情況?
下面的代碼在3個模塊中。 謝謝你。
symbols.h文件:
#include <stdlib.h>
#include <stdio.h>
#define TABLE_SIZE 26
typedef struct symbol_node
{
char* name;
int type;
int role;
struct symbol_node* next;
} symbol_node;
typedef struct table_node
{
struct symbol_node* symbols_table[TABLE_SIZE];
struct table_node* prev;
struct table_node* next;
} table_node;
static struct table_node* cur_table;
//functions declarations:
void init_table();
int hash_function(char* id);
symbol_node* lookup(char* id_name);
symbol_node* insert(char* id_name);
// debug
void printtable();
symbols.c
void init_table() // creates the first node
{
int i = 0;
cur_table = NULL;
cur_table = (table_node*)malloc(sizeof(table_node));
cur_table->prev = NULL;
cur_table->next = NULL;
for(i=0; i < TABLE_SIZE; i++)
{
cur_table->symbols_table[i] = NULL;
}
}
symbol_node* lookup(char* id_name) // returns null if the id name not found
{
symbol_node* result = NULL;
symbol_node* temp = NULL;
int entry = atoi(id_name);
temp = cur_table->symbols_table[entry];
while(temp != NULL)
{
if(strcmp(id_name, temp->name) == 0)
{
result = temp;
break;
}
else
temp = temp->next;
}
return result;
}
symbol_node* insert(char* id_name)
{
symbol_node* result = NULL;
symbol_node* temp = NULL;
int index = -1;
if(lookup(id_name)==NULL)
{
index = atoi(id_name);
temp = cur_table->symbols_table[index];
while(temp!=NULL)
{
temp = temp->next;
}
temp = (symbol_node*)malloc(sizeof(symbol_node));
temp->next = NULL;
temp->name = id_name;
// TODO: other params
result = temp;
}
return result;
}
void printtable()
{
int i=0;
for(i=0; i<TABLE_SIZE; i++)
{
if(cur_table->symbols_table[i]==NULL)
printf("NULL at index %d\n",i);
else
printf("There are something\n");
}
}
的main.c
void main()
{
int i=0;
symbol_node* t = NULL;
symbol_node* tt = NULL;
init_table();
t = insert("markhit");
t = insert("mark");
tt = lookup("mark");
printtable();
_getch();
free(t);
free(tt);
free(cur_table);
}
什麼是運行時錯誤消息?當你在調試器中運行代碼時,你學到了什麼? – 2012-02-23 08:40:04
運行時錯誤是訪問衝突,我發現主指針「cur_table」看起來沒有初始化,儘管我創建了一個init函數。 – NickF 2012-02-23 08:56:21
這段代碼對我來說工作的很好,如果我在main函數返回之前添加free()語句,valgrind沒有檢測到任何泄漏。 – Coren 2012-02-23 09:02:49