Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2014, 22:17   #1
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию Хэш таблица

Всем привет.
Вот создаю хэш таблицу. Не могу кое-что понять.
Вводимые данные - строка. Хэш фу-я - суммирует коды аски всех букв из строки и делит на 7. Ключи - от 0 до 6.

Код:
typedef struct _list
{
	char sr[100];
	struct _list *next;
}list_;

_list* head0,head1,head2,head3,head4,head5 ,head6;

То есть, мне нужно 7 списков.
Сначала я думал создать их отдельно, но понял, что потом будет много мороки. Решил создать массив из 7 структур.
Помогите, пожалуйста, как мне записать этот массив.
Я хотел бы сразу присвоить каждому элементу свой список, именно в объявлении. Типу _list *heads[]={head0,head1,head2}, но у меня выдаёт ошибку, что-то с указателями не то, но я не шарю что именно.
Не могу понять.
Спасибо.
guroDragon вне форума Ответить с цитированием
Старый 20.05.2014, 22:27   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1) Не нужно кросспостить
2)
Код:
typedef struct list
{
    char sr[100];
    struct list *next;
}list;
...
list *heads[7];
for (int i = 0; i < 7; ++i)
  heads[i] = NULL;
Когда хотите добавить в список новый элемент, то проверяете на NULL соответствующую "голову".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.05.2014, 23:00   #3
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
1) Не нужно кросспостить
2)
Код:
typedef struct list
{
    char sr[100];
    struct list *next;
}list;
...
list *heads[7];
for (int i = 0; i < 7; ++i)
  heads[i] = NULL;
Когда хотите добавить в список новый элемент, то проверяете на NULL соответствующую "голову".
То есть потом можно элементу массива присвоить список, да?
После того, как выполнился этот цикл?
guroDragon вне форума Ответить с цитированием
Старый 20.05.2014, 23:23   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да. Алгоритм примерно:
Посчитали хеш
Выбрали список, куда добавлять
Если элемент NULL, то выделили память, занесли в структуру строку и указатель next инициализировали NULL, присвоили элементу адрес структуры
Если элемент не NULL, то проверили на совпадение со строкой, хранящейся в структуре по имеющемуся адресу, если совпало, то добавлять не нужно (наверное), а если не совпало, то по указателю в структуре движетесь по списку (сравнение проводить для каждой структуры в списке), пока не дойдете до NULL, куда нужно "привесить" новую структуру
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 20.05.2014 в 23:26.
BDA вне форума Ответить с цитированием
Старый 20.05.2014, 23:28   #5
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да. Алгоритм примерно:
Посчитали хеш
Выбрали список, куда добавлять
Если элемент NULL, то выделили память, занесли в структуру строку и указатель next инициализировали NULL, присвоили элементу адрес структуры
Если элемент не NULL, то проверили на совпадение со строкой, хранящейся в структуре по имеющемуся адресу, если совпало, то добавлять не нужно (наверное), а если не совпало, то по указателю в структуре движетесь по списку (сравнение проводить для каждой структуры в списке), пока не дойдете до NULL, куда нужно "привесить" новую структуру
Спасибо.
Это-то я понял, я просто не мог понять, как занести свои списки для хранения value в массив. Никак не получилось(
guroDragon вне форума Ответить с цитированием
Старый 20.05.2014, 23:41   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
typedef struct list
{
    char sr[100];
    struct list *next;
} list;

list *h1, *h2;
list *heads[] = {h1, h2};
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.05.2014, 23:44   #7
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
typedef struct list
{
    char sr[100];
    struct list *next;
} list;

list *h1, *h2;
list *heads[] = {h1, h2};
Вау, заработало. У меня вроде всё так же было. Только вот указатель был не возле переменных, а прям возле её типа. Это что-то меняет, да?
guroDragon вне форума Ответить с цитированием
Старый 20.05.2014, 23:53   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если судить по коду в первом сообщении:
Объявлен тип list_, а производится попытка объявления переменных типа _list
Запись _list* head0,head1... обозначает _list* head и _list head1 (head0 - указатель на _list, head1 - переменная типа _list).

UPD
Пожалуйста
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.05.2014 в 00:16.
BDA вне форума Ответить с цитированием
Старый 20.05.2014, 23:57   #9
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если судить по коду в первом сообщении:
Объявлен тип list_, а производится попытка объявления переменных типа _list
Запись _list* head0,head1... обозначает _list* head и _list head1 (head0 - указатель на _list, head1 - переменная типа _list).
Спасибо большое!
Юный программист доволен :3
guroDragon вне форума Ответить с цитированием
Старый 21.05.2014, 14:42   #10
guroDragon
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 83
По умолчанию

Гляньте, плиз, код. Что-то он вылетает при добавлении value в хэш таблицу.
Хэш функция - суммирование аски кодов всех символов стринга и деление на 7. Получается 7 кеев - 0,1,2,3,4,5,6.
Не знаю, из-за чего именно вылетает. Написаны 2 фу-и - добавление и вывод на экран. При использовании фу-и добавление, прога вылетает. Пишет, что добавление успешно завершено и тухнет.
Помогите, пожалуйста.
Спасибо.
ЗЫ. Дебагером пользоваться не умею, но вот что-то там прочёл при нахождение ошибки.
1 - program received signal sigtrap trace/breakpoint trap
2 - ntdll!RtlUnhandledExceptionFilter()
Не знаю, это важное что-то или просто хлам.
Код:
int f_add(const char str[100])
{
	int lngth;
	list *tmp;
	system("cls");
	fflush(stdin);
	fflush(stdout);
	lngth=0;
	for (int j=0;j<strlen(str);j++) lngth+=str[j];
	lngth=lngth%7;
	strcpy(tmp->data,str);
	tmp->next=NULL;
	if (heads[lngth]==NULL) heads[lngth]=tmp;
	else
	{
		while (heads[lngth]->next!=NULL) heads[lngth]=heads[lngth]->next;
		heads[lngth]->next=tmp;
	}
	printf(" The adding is successfully completed.\n");	
	return 0;
}
Код:
{
								num++;
								system("cls");
								do
								{
									fflush(stdin);
									system("cls");
									if (i!=0) printf(" Error.\n");
									printf(" Please, enter the string\n >>");
									gets(str);
									i++;
									
								}while ((strlen(str)<1) || (str[0]==' '));
								system("cls");	
								f_add(str);
								system("pause");
								break;
guroDragon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хэш таблица guroDragon Помощь студентам 2 19.05.2014 21:28
хэш таблица R0807D06 Общие вопросы C/C++ 1 13.08.2013 15:51
Хэш-таблица. Метод цепочек. C++ Playa-RC Помощь студентам 0 10.03.2012 15:07
хэш-таблица с открытой адресацией Olya13254 Помощь студентам 0 04.01.2011 17:27