2017-04-10 9 views
-2

ハッシュテーブル操作に関する割り当てがあります。私が含めるべき操作は、テーブル全体の内容を挿入、検索、削除、および印刷することです。挿入、削除、検索はうまくいくようですが、なぜ私のプリント機能が動作しないのかわかりません。私は本当に何も印刷されません。 (私はこの問題を解決した後、私は、ファイルに出力します。) ここでは(ヘッダmyfunctions.hによってリンクされmyfunctions.c、)関数です:ハッシュテーブルの印刷

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define B 26 
#include "myfunctions.h" 

int hashfunction(char *name){ 
int sum; unsigned long len; 
sum = 0; 
len = strlen(name); 
for (int i=0; i<len; i++) { 
    sum+=name[i]; 
} 
return (sum%26); 
} 

void fillNode(NodeT *p, char *value){ 
p->name=value; 
} 

void insert(NodeT **Bucket, char *name){ 

NodeT *p=(NodeT*)malloc(sizeof(NodeT)); 

if(p){ 
    fillNode(p, name); 
    int h=hashfunction(p->name); 

    if(Bucket[h]==NULL){ 
     Bucket[h]=p; 
     p->next=NULL; 
    } 
    else { 
     p->next=Bucket[h]; 
     Bucket[h]=p; 
    } 
} 
} 

NodeT *findNode(NodeT **buckets, char *str){ 
int ok=0; 
int i=0; 
NodeT *aux=(NodeT*)malloc(sizeof(NodeT)); 

for(i=0;i<B;i++){ 
    NodeT *p=buckets[i]; 
    while(p){ 
     if(strcmp(p->name, str)==0) 
     { 
      ok=1; 
      aux=p; 
     } 
     p=p->next; 
    } 
} 
if(aux!=NULL) return aux; 
else return NULL; 
} 

void deleteNode(NodeT **buckets, char *str){ 

NodeT **link=&buckets[hashfunction(str)]; 

while(*link){ 
    NodeT *aux=*link; 
    if(strcmp(aux->name, str)==0){ 
     *link=aux->next; 
     free(aux); 
     break; 
    } 
    else link=&(*link)->next; 
} 
} 

void printNodes(NodeT **buckets){ 

int i=0; 
for(i=0;i<B;i++){ 
    NodeT *p=buckets[23]; 
    while(p){ 
     printf("%s\n", p->name); 
     p=p->next; 
    } 

} 
} 

そして、これはmain.cのである:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "myfunctions.h" 
#define B 26 

int main() { 

FILE *input=fopen("/Users/andreibrasoveanu/Desktop/Teme CP/lab 6 - hashtables/lab 6 - hashtables/input.txt", "r"); 
FILE *output=fopen("/Users/andreibrasoveanu/Desktop/Teme CP/lab 6 - hashtables/lab 6 - hashtables/output.txt", "w"); 

char cmd[100]; 
char s[100]; 

NodeT **Bucket=(NodeT**)malloc(B*sizeof(NodeT*)); 
for(int i=0; i<26; i++) { 
    Bucket[i]=NULL; 
} 

int hashcode; 
char c; 

while(fscanf(input, "%s\n", cmd)!=-1){ 
    c=cmd[0]; 

    strcpy(s, cmd+1); 

    switch (c) { 
     case 'i': 
     { 
      hashcode=hashfunction(s); 
      insert(Bucket, s); 
     } 
      break; 

     case 'd':{ 
      deleteNode(Bucket, s); 
     } 
      break; 

     case 'f':{ 
      if(findNode(Bucket, s)!=NULL) printf("%s was found", s); 
     } 
      break; 
     case 'l':{ 
      printNodes(Bucket); 
     } 
      break; 
     default: 
      break; 
    } 
} 



return 0; 
} 
また、ヘッダファイル(myfunctions.h):

typedef struct node{ 
char *name; 
struct node *next; 
}NodeT; 

int hashfunction(char *name); 
void insert(NodeT **Bucket, char *name); 
NodeT *findNode(NodeT **buckets, char *str); 
void deleteNode(NodeT **buckets, char *str); 
void printNodes(NodeT **buckets); 

入力ファイルは次のようになります

iBob 
iMary 
dBob 
l 

私はXcode btwで作業します。そのため、ファイルのパスが長すぎます。

+3

'NodeTの* pを=バケット[23できるように、それはのようなものを必要とします]; '--->' NodeT * p =バケット[i]; ' – StoryTeller

+0

ええ、私はそれを修正しましたが、まだ動作しません –

+1

このhttps://ericlippert.com/2014/03/05/how-to- debug-small-programs/ – StoryTeller

答えて

1

これらのコード行が正しくありません:

void fillNode(NodeT *p, char *value){ 
    p->name=value; 
} 

構造要素の「name」のcharへのポインタであるが、私はこれのために割り当てられたメモリが表示されません。また、あなたは、各スイッチのラベル​​に中括弧を必要としない

 p->name = strdup(value); 

case 'i': 
    { 
     hashcode=hashfunction(s); 
     insert(Bucket, s); 
    } 
     break; 

case 'i':   
     hashcode=hashfunction(s); 
     insert(Bucket, s); 

     break;