массив связанного списка для хэш-таблицы - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу знать о том, чтобы принести текстовый файл с 10 именами и прочитать его.10 имен сортируются по убыванию и формированию хеш-таблицы с методом деления.Мне нужно построить связанный список из них.Индекс хеш-таблицы равен 7.

Я пробовал переменную указателя совпадения и создал хеш-таблицу, но не могу этого сделать.У меня проблемы с созданием хеш-таблицы, вставкой данных, печатью хеш-таблицы и поиском данных (функция для поиска при вводе имени).Мне нужно добавить больше функций .. как я это сделал?

#define SIZE 7


struct node {
   char data[100][20];
   struct node* next; 
}; 

struct index {
   struct node* head; 
   int count; 
};



struct sum (data){ 
   struct node* ptr;

   int sum,i;
   for (i=0; i<20; i++) {
    ptr -> data[i] = ptr;
    strcpy(sum,ptr);
   }

  return sum;   
};


int hashFunction (int sum) { 

    return sum%SIZE; 
}



void descend (data) { 

    int temp;
    for(i=0;i<100;i++) {
       for(j=0;j=20;j++) {
         if (data[i][j+1]>data[i][j])
            temp=data[i][j];
            data[i][j]=data[i][j+1];
            data[i][j+1]=temp;
         }
    }   
}



int main (void) {

    char data[100][20];
    FILE *fp;
    fp = fopen("data.txt","r");
    for (int i=0; i<20; i++)
        fscanf (fp,"%s",&data);
        printf("%s\n",data);
    }
    fclose(fp);
    hashTable = (struct index*)malloc(SIZE*sizeof(struct index));
    descend(data);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Для начала, похоже, что вы должны объявить char data[20][100] вместо char data[100][20].

Затем, внутри цикла из 20 итераций, вы должны обратиться к data[i] вместо data:

for (int i=0; i<20; i++)
    fscanf(fp,"%s",data[i]);
    printf("%s\n",data[i]);
}

Имейте в виду, что вы предполагаете, что каждая строка во входном файле имеет длину не более 99 символов.

Это не отвечает на настоящий вопрос, я полагаю, но выдолжен по меньшей мере исправить все вышеперечисленное.

0 голосов
/ 26 декабря 2018

В коде много ошибок, я просто выкладываю свое возможное наблюдение.Во-первых, это

fscanf (fp,"%s",&data);

должно быть

fscanf (fp,"%s",&data[i]);

Во-вторых, здесь в descend() части функции внутреннего цикла функции вы используете j=20, который работает бесконечно.Вот где MACRO пригодится, так как этот j=20 просто запускается, т. Е. Если он может иметь ROW=j, где ROW равен 20, то компилятор выдает значимую ошибку.Эта функция

void descend (data) { /* what is the tyep of data ?  you should mention the data type */ 
    int temp;
    for(i=0;i<100;i++) { /* there are only 20 lines not 100 i.e it should be i<20 */
       for(j=0;j=20;j++) { /* condition is wrong, you indented for j<20 but that too
                             wrong as there are supposed to be max 100 char in line 
                             it should be j<100 */
         if (data[i][j+1]>data[i][j]) /* condition is not correct */
            temp=data[i][j];
            data[i][j]=data[i][j+1];
            data[i][j+1]=temp;
         }
    }   
}

Правильная версия descend может быть

void descend (char (*data)[ROW], int col) {  /* define ROW as macro with value 20 and pass the col i.e 100 */

    int temp;
    for(i=0;i < ROW; i++) {
       for(j=0;j < col; j++) {
         if (data[i][j] > data[i][j+1])
            temp = data[i][j];
            data[i][j] = data[i][j+1];
            data[i][j+1] = temp;
         }
    }   
}

Также проверьте возвращаемое значение fopen(), чтобы проверить, был ли он успешным, r не пройден, и выполнить правильную проверку.Например,

fp = fopen("data.txt","r");
if(fp == NULL) {
   /* @TODO error handling */
   fprintf(stderr,"file doesn't exist");
   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...