2017-04-10 4 views
-2

Ich habe eine Zuweisung in Bezug auf einige Hashtable-Operationen. Die Operationen, die ich einschließen sollte, sind Einfügen, Suchen, Löschen und Drucken des gesamten Tabelleninhalts. Das Einfügen, Löschen und Finden scheint gut zu funktionieren, aber ich kann nicht verstehen, warum meine Druckfunktion nicht funktioniert. Ich bekomme wirklich nichts gedruckt. (Ich werde in Datei drucken, nachdem ich dieses Problem lösen.) Hier sind die Funktionen (myfunctions.c, durch den Header myfunctions.h verknüpft):Drucken einer Hashtabelle

#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; 
    } 

} 
} 

Und das ist die 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; 
} 

Und auch die Header-Datei (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); 

Eingabedatei wäre:

iBob 
iMary 
dBob 
l 

Ich arbeite in Xcode BTW, deshalb ist der Pfad für die Dateien so lang.

+3

'NodeT * p = Eimer [23 ]; '--->' NodeT * p = Eimer [i]; ' – StoryTeller

+0

yeah Ich reparierte das, funktioniert immer noch nicht –

+1

Lesen Sie dieses https://ericlippert.com/2014/03/05/how-to- debug-small-programme/ – StoryTeller

Antwort

1

Diese Zeilen Code ist falsch:

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

Das Strukturelement ‚name‘ ist ein Zeiger auf char, aber ich sehe keine für diese zugewiesenen Speicher. So braucht es so etwas wie:

 p->name = strdup(value); 

Auch brauchen Sie keine geschweiften Klammern an jedem Switch-Label:

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

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

     break; 
Verwandte Themen