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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 15:07   #1
CHUCKe
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

надо реализовать хеш-таблицы с открытым и закрытым хеширование.
на паскале этобы пробелмой не было но вот на си...
const В = { подходящая константа };
type celltype = record
elетеt: nametype;
next: ^celltype
end;
DICTIONARY = array[0..B-1] of ^celltype; //как записать это на си/с++???

вопрос сообсвенно в коде.

ну кто-нибудь

Код:
#include <iostream>

#define maxn 1000

 struct spis 
 {
    char *val;
    struct spis *next;
};

typedef struct spis *dictionary[maxn];


int ord(char o)
    return (unsigned char) o;
}

int hash (char *x)
{
 int i,sum=0;
 for(i=0;i<10;i++)
    sum+=ord(x[i]);
  return sum%maxn; 
}

void makenull(dictionary k)
{
	for(int i=0;i<maxn;i++)
	k[i]=0;
}

bool member(char *x,dictionary k)
{
	spis *cur;
	cur=k[hash(x)];
	while (cur!=0)
	{
		if (cur->val==x)
		 return true;
		else //èíà÷å
		 cur=cur->next;
	}
	return false;
}

void insert(char *x,dictionary k)
{
	
	int symb;
	spis *oldhead;
	if (!member(x,k))
	{
		char *x1=new char[strlen(x)+1];
        strcpy(x1,x);
		symb=hash(x1);
        oldhead=k[symb];
        k[symb]=new spis; 
        k[symb]->val=x1; 
        k[symb]->next=oldhead; 
	}
}

void del(char *x,dictionary k) 
{

	int symb;
	spis *cur;
	symb=hash(x);
	bool f=true;
	if (k[symb]!=0)
	{
		if (k[symb]->val==x)
		 { 
		  spis *chuck=k[symb];
		  k[symb]=k[symb]->next;
          delete chuck;
          delete [] chuck->val;
		 }
		  else 
          {
          	cur=k[symb];
          	while((cur->next!=0)&&(f))
          	 if (cur->next->val==x)
          	 {
          	 	spis *chuck=cur->next;
                cur->next=cur->next->next;
          	 	delete [] chuck->val;
	            delete chuck;
                f=false;
          	 }
          	 else
          	 cur=cur->next;
          }
	}
}

void show(dictionary k)
{
	spis *cur;
     int i=0;
     while (i<maxn)
     {
	     cur=k[i];
	      if (k[i]==0)
	       {
		    cout<<i<<" ";
		    i++;
	       }
	       else
	        {
		     while (cur->next!=0)
		     {
		      cout<<cur->val<<" ";
	          cur=cur->next;
		     }
		     i++;
	        }
	      cur=0;
		  cout<<endl;
       }
}

int main()
{
   dictionary d;
   char s1[10];
   cin>>s1; 
   for(int i=0;i<maxn;i++)
   d[i]=new spis;
   insert(s1,d);
   strcpy(s1,"wet");
   del(s1,d);
 // show(d);
   makenull(d);
}
не работает!
help!!

Последний раз редактировалось Stilet; 18.11.2010 в 09:41.
CHUCKe вне форума Ответить с цитированием
Старый 16.11.2010, 14:02   #2
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

В структуре используется поле типа char* - память под нее кто выделять будет? И в функциях ты присваиваешь переменным одного типы переменные другого, например структуре число типа int.
optimator вне форума Ответить с цитированием
Старый 17.11.2010, 23:30   #3
CHUCKe
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

уже сделал все.
CHUCKe вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ХЕШ-таблица iceman2112 Общие вопросы C/C++ 0 09.05.2010 13:07
Хеш-функция pwdan Помощь студентам 4 21.04.2010 12:58
Хеш - Функции 777Aidar777 Помощь студентам 0 30.12.2009 11:36
Неправильная хеш функция.(Java) _Studentka_ Помощь студентам 0 09.12.2009 22:54
Хеш-таблица. Непонятно с решением коллизии методом перемешивания внутренними цепочками Познающий Помощь студентам 9 05.12.2009 02:48