Здесь у меня есть действительно подробное объяснение моей домашней работы и проблем в коде.Есть две части домашнего задания, и код для первой части работает, но после изменения его для второй части он больше не работает.
Домашнее задание: Сохранить имя человека и самое быстрое время работы с помощью словаря (с открытым хешированием, то есть словарь представлен хеш-таблицей, которая представляет собой массив с элементами B, гдеЭлемент массива представляет собой связанный список элементов типа celltype. Хэш-таблица использует хеш-функцию h (name), где для i = 1, ..., B-1, если h (name) = i, то данные оперсона с «именем» сохраняется в связанном списке в i-м элементе словаря. Люди сортируются по имени.)
Вот как это выглядит.
#define B 20
typedef struct celltag{
char name[11];
double time;
struct celltag *next;
} celltype;
typedef celltype **Dictionary;
int h(char name[]){
int i, sum=0;
for(i=0;name[i]!='\0';i++) {
sum+=name[i];
}
return sum % B;
}
void DiMakeNull (Dictionary *Ap){
int i;
for(i=0;i<B;i++) (*Ap)[i]=NULL;
}
void DiInsert(char name[], double time, Dictionary *Ap){
int bucket;
celltype *oldheader;
if(DiMember(name, *Ap)==0){
bucket=h(name);
oldheader=(*Ap)[bucket];
(*Ap)[bucket]=(celltype*)malloc(sizeof(celltype));
strcpy((*Ap)[bucket]->name, name);
(*Ap)[bucket]->time= time;
(*Ap)[bucket]->next=oldheader;
}
}
(Функция DiMember (имя персонажа [], Словарь A) возвращает 1, если в словаре есть человек, и 0, если нет.)
Эта часть работает так, как должна.
Теперь следующаячасть домашнего задания: Сортировка людей по времени их выполнения с использованием другого массива указателей, где первый элемент массива указывает на данные самого быстрого человека, второй элемент - на второго самого быстрого человека и т. д.
Моя идея состояла в том, чтобы сделатьдругой словарь, давайте назовем его словарь массив.Теперь, вставляя данные нового человека в исходный словарь Ap, я хотел вызвать другую функцию void Sort (celltype * Data, Dictionary * Array), которая принимает тип ячейки, в которой хранятся данные нового человека, и массив, в который мы будем вставлятьэто отсортировано по времени.
Поскольку я использовал бы это в DiInsert, я изменил его на
void DiInsert(char name[], double time, Dictionary *Ap, Dictionary *Array){
int bucket;
celltype *oldheader;
if(DiMember(name, *Ap, 0)==0){
bucket=h(name);
oldheader=(*Ap)[bucket];
(*Ap)[bucket]=(celltype*)malloc(sizeof(celltype));
strcpy((*Ap)[bucket]->name, name);
(*Ap)[bucket]->time= time;
(*Ap)[bucket]->next=oldheader;
celltype *send;
send=(*Ap)[bucket];
send->next=NULL;
Sort(send, Array);
}
}
(Все то же самое, за исключением того, что я добавил еще один параметр в функцию и добавил этот бит (celltype *)send; ... Sort (send, Array);) в конце.)
А вот так выглядит функция:
void Sort(celltype* Data, Dictionary *Array){
if ((*Array)[0]==NULL){
(*Array)[0]=Data;
(*Array)[0]->next=NULL;
}
else{
int i;
for(i=0;(*Array)[i]!=NULL;i++){
if(Data->time < (*Array)[i]->time){
celltype *new;
new=(*Array)[i];
(*Array)[i]=new;
(*Array)[i]->next=NULL;
int j=i+1;
while((*Array)[j]!=NULL){
celltype *old;
old=(*Array)[j];
(*Array)[j]=new;
(*Array)[j]->next=NULL;
new=old;
j++;
}
(*Array)[j]=new;
(*Array)[j]->next=NULL;
break;
}
}
}
}
Вот мои проблемы:
Возникла проблема при вызове функции сортировки / параметров функции.У меня все еще есть некоторые проблемы с пониманием указателей, поэтому я не совсем уверен, как это исправить.
Перед изменением DiInsert сработал первый бит кода.Теперь, после изменения и добавления void Sort (), по некоторым причинам он иногда удваивает данные в исходном словаре Ap и сохраняет их в правильной i-й скобке, но также и в некоторых других скобках.
Также удваивает данные в массиве словаря.Например, если я введу 'Mark' как имя и 10.1 как время, h (Mark) = 15, то это сохранит данные Марка в 15-й скобке словаря Ap.Затем он сохраняет данные Марка в 0-й скобке в массиве словаря (как и должно быть, потому что данные Марка являются первыми введенными данными и являются самыми быстрыми на данный момент), но затем он также сохраняет их в 16-й скобке.Почему?