- Член од
- 25 март 2012
- Мислења
- 40
- Поени од реакции
- 6
- Возраст
- 33
Follow along with the video below to see how to install our site as a web app on your home screen.
Забелешка: This feature may not be available in some browsers.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
#define MEMCHECK(x) if(x==NULL) { printf("Nema memorija!\n"); exit(-1); }
typedef char * key_struct;
typedef char * value_struct;
typedef struct hashmap_element
{
key_struct key; // kluc
value_struct value; // vrednost
} hashmap_node; // Definiranje element vo hash mapa
typedef struct element
{
hashmap_node info;
struct element *link;
} h_node; // Definiranje na element vo linearna lista (koficka) vo hash mapa
typedef h_node * h_nodep;
typedef struct obht
{
int size;
h_node ** buckets; // niza od koficki
int occupancy; // broj na zafateni ili poranesno zafateni koficki
hashmap_node *former; // marker za jazel koj e izbrisan, no nema nov na negovo mesto
} hashmap; // Definiranje na hash mapa
void make_hash_map(hashmap *tptr, int n) // inicijalizacija na hash mapa
{
int i;
tptr->buckets=(h_node **) calloc(n, sizeof(h_node *));
// alokacija na memorija za nizata od koficki
tptr->size=n;
tptr->occupancy=0;
tptr->former=(hashmap_node *) malloc(sizeof(hashmap_node));
tptr->former->key=NULL;
tptr->former->value=0;
for(i=0;i<tptr->size;i++)
tptr->buckets[i]=NULL;
}
int hashCode(key_struct key)
{
return key[0]-'A';
}
int hash(key_struct key, hashmap *tptr)
{
// funkcija koja presmetuva hash
return hashCode(key)%(tptr->size);
}
int search(key_struct targetKey, hashmap *tptr)
// funkcija za prebaruvanje vo hash, go vraka indeksot na kofickata vo koj se naoga baraniot kluc
{
int h;
int n_search=0;
h_node *p;
h=hash(targetKey, tptr);
for(;;)
{
p=tptr->buckets[h];
if(p==NULL) return -1;
else if((((p->info).key)!=tptr->former->key)&&(!strcmp((p->info).key, targetKey)))
return h;
else
{
h=(h+1)%(tptr->size);
n_search++;
if(n_search==tptr->size)
return -1;
}
}
}
void insert(key_struct key, value_struct val, hashmap *tptr)
// funkcija za vnesuvanje vo hash
{
h_node *old;
int n_search=0;
h_node *p;
int h;
h=hash(key, tptr);
p=(h_node *) malloc(sizeof(h_node)); // alokacija za noviot jazel
(p->info).value=val;
(p->info).key=key;
for(;;)
{
old=tptr->buckets[h];
if(old==NULL)
{
if(++tptr->occupancy == tptr->size)
{
printf("Hash tabelata e polna!!!\n");
}
// se vnesuva noviot jazel vo kofickata h
p->link=NULL;
tptr->buckets[h]=p;
return;
}
else if((((old->info).key)==tptr->former->key)||(!strcmp(key,(old->info).key)))
{
p->link=NULL;
tptr->buckets[h]=p;
return;
}
else
{
h=(h+1)%(tptr->size);
n_search++;
if(n_search==tptr->size)
return;
}
}
}
void delete(key_struct key, hashmap *tptr)
// funkcija za brisenje na onie jazli so ist kluc kako dadeniot
{
h_node *old, *last;
int n_search=0;
int h;
h=hash(key,tptr);
for (;;)
{
old=tptr->buckets[h];
if(old==NULL)
return; // ako nema takvi jazli za brisenje
else if(((old->info).key!=tptr->former->key)&&(!strcmp((old->info).key, key)))
{
(tptr->buckets[h]->info).key=tptr->former->key;
(tptr->buckets[h]->info).value=tptr->former->value;
//tptr->buckets[h]=NULL;
//free(old); // brisenje na jazel
return;
}
else
{
h=(h+1)%(tptr->size);
n_search++;
if(n_search==tptr->size)
return;
}
}
}
void print_h_node(h_node *p)
{
printf("(%s,%s)",(p->info).key,(p->info).value);
}
void print_hashmap(hashmap *tptr)
{
int i;
h_node *p;
for(i=0; i<tptr->size; i++)
{
printf("%d:",i);
for(p=tptr->buckets[i]; p!=NULL; p=p->link)
print_h_node(p);
printf("\n");
}
}
int main()
{
hashmap *hashTabela=(hashmap *)malloc(sizeof(hashmap));
int N,i;
scanf("%d",&N);
//--Sami ja postavuvate goleminata na hesh tabelata
make_hash_map(hashTabela,N);
char mkd[1000][100];
char ang[1000][100];
for(i=0; i<N; i++)
{
scanf("%s",mkd[i]);
scanf("%s",ang[i]);
insert(ang[i],mkd[i],hashTabela);
}
char chang[1000][100];
i=0;
while(scanf("%s", chang[i])){
if(!strcmp("KRAJ",chang[i]))
break;
i++;
}
for(i=0;i<N;i++)
{
int tmp;
tmp=search(chang[i],hashTabela);
if(tmp==-1)
{
printf("Hm");
}
else
{
printf("%s",chang[i]);//ako e vaka gi printa istite zborovi kako da go najdam makedonskiot ?
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s1[3] = "foo";
printf("%s\n", s1);
system("PAUSE");
return 0;
}
printf("%s\n",hashTabela->buckets[i]->info.value)
Може е level n00b прашањево, али ајде
Зошто кога декларирам и иницијализирам низа од знаци (пошто нели C нема податочен тип string), и да нема доволно место за \0 терминаторот, пример:
Код:#include <stdio.h> #include <stdlib.h> int main() { char s1[3] = "foo"; printf("%s\n", s1); system("PAUSE"); return 0; }
Должината на низата е 3, а нели на нејзе и фали уште едно место за \0 терминаторот. Како е можно ова да помине у компајлер и да не јави никаква грешка? Благодарам однапред![]()
/* vaka kompajlerot sam ja odrduva dolzinata
na stringot i dodava \0 na kraj. */
char str[] = "foo";
/*Ili koristi pointer kon niza od znaci */
char *str = "foo";
Тоа обично поминува кај сите компајлери. Јас конкретно го пробав на gcc, на Ubuntu.
Меѓутоа кога ќе го извршиш кодот обично дава неправилни резултати, затоа што програмата не знае до каде е низата, иако ти при декларацијата си навел [3]. Дури и да извршиш strlen не очекувај да ти врати должина 3. Затоа нека биде пракса при користење на стрингови во C дефинирањето да биде на еден од овие начини:
Код:/* vaka kompajlerot sam ja odrduva dolzinata na stringot i dodava \0 na kraj. */ char str[] = "foo"; /*Ili koristi pointer kon niza od znaci */ char *str = "foo";
Ace-Snake
Епа таа функција search враќа број од 0 до N ако тој збор постои во табелата, а тој број значи во која кофичка е и затоа можеш вака :
--- надополнето: 17 декември 2012 во 20:01 ---Код:printf("%s\n",hashTabela->buckets[i]->info.value)
Boomerang
Реално да, треба да прави проблем но во овој случај и многу вакви слични прости пгограми не прави , не знам дали е до самото IDE или оперативниот систем вредноста после тоа е \0. А не јавува грешка бидејќи е C/C++ и се предпоставува дека знаеш што правиш, имаш слобода буквално како сакаш да играш со меморијата на компјутерот..