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.
'NodeT * p = Eimer [23 ]; '--->' NodeT * p = Eimer [i]; ' – StoryTeller
yeah Ich reparierte das, funktioniert immer noch nicht –
Lesen Sie dieses https://ericlippert.com/2014/03/05/how-to- debug-small-programme/ – StoryTeller