2012-02-23 230 views
1

我有一個鏈表和每個節點中的散列表。哈希表由一個指向結構體的指針數組實現。整個管理是通過一個全局靜態指針指向鏈表來完成的。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); 
} 
+1

什麼是運行時錯誤消息?當你在調試器中運行代碼時,你學到了什麼? – 2012-02-23 08:40:04

+0

運行時錯誤是訪問衝突,我發現主指針「cur_table」看起來沒有初始化,儘管我創建了一個init函數。 – NickF 2012-02-23 08:56:21

+1

這段代碼對我來說工作的很好,如果我在main函數返回之前添加free()語句,valgrind沒有檢測到任何泄漏。 – Coren 2012-02-23 09:02:49

回答

-1

避免內存分配[`的malloc']靜態。嘗試一下

cur_table = new table_node; 

對於靜態分配的內存,您無法爲內存原因設置您的值。當您插入它時不會重新分配您的cur_table

+0

「新」是C++,而不是C. – 2012-02-23 09:25:12

+0

問題因爲'cur_table'指針是在其他h文件中定義的。但是插入功能還有另一個問題。當我分配'temp = cur_table-> symbols_table [index];'臨時值保持爲NULL。 – NickF 2012-02-23 09:58:37