-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で作業します。そのため、ファイルのパスが長すぎます。
'NodeTの* pを=バケット[23できるように、それはのようなものを必要とします]; '--->' NodeT * p =バケット[i]; ' – StoryTeller
ええ、私はそれを修正しましたが、まだ動作しません –
このhttps://ericlippert.com/2014/03/05/how-to- debug-small-programs/ – StoryTeller