#2 gna
Děkuji za odpověď, nešlo by to ale udělat bez použití vektorů. Vektory jsme ještě neměli nevím jestli by mi to uznali tu úlohu.
Příspěvky odeslané z IP adresy 185.199.85.–
Dobrý den, máme za úkol navrhnout hashovací tabulku kde se kolize řeší zřetězením. Hashovací tabulku se mi povedlo funkčně sestavit, ale k tomu máme ještě udělat průměr a maximum uložených seznamů. Chtěl bych se Vás tedy zeptat zda byste mi neporadili jak na to. Předem děkuji za Váš čas.
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include<time.h>
#define min 5
#define max 20
#define M 10007
#define M2 10000
void InsertHash(char* str,unsigned int length,unsigned int i);
bool SearchHash(char* str,unsigned int length,unsigned int i);
struct ListItems
{
char* data;
ListItems* next;
ListItems* prev;
};
struct List
{
ListItems* head;
List()
{
head = NULL;
}
bool Search(char* x)
{
ListItems* p;
for (p = head; p != NULL; p = p->next)
if (p->data == x)
return true;
return false;
}
unsigned int Insert(char *x)
{
ListItems* p;
p = new ListItems;
p->data = x;
p->next = head;
if (head != NULL)
head->prev = p;
head = p;
p->prev = NULL;
}
};
List HashTable[M];
List HashTable2[M2];
unsigned int DJBHash(const char* str,unsigned int length)
{
unsigned int hash = 5381;
unsigned int i = 0;
for (i = 0; i < length; ++str, ++i)
{
hash = ((hash << 5) + hash) + (*str);
}
return hash%M;
}
void InsertHash(char* str,unsigned int length ,unsigned int i )
{
unsigned int hashKey = DJBHash(str,length);
if(i==1)
HashTable[hashKey].Insert(str);
else if(i==2)
HashTable2[hashKey].Insert(str);
}
bool SearchHash(char* str,unsigned int length,unsigned int i)
{
unsigned int hashKey = DJBHash(str,length);
if(i==1)
return HashTable[hashKey].Search(str);
if(i==2)
return HashTable2[hashKey].Search(str);
}
char *stri(unsigned int length)
{
static const char letters[] = "abcdefghijklmnopqrstuvwxyz";
char *s = (char*)malloc((length + 1) * sizeof(char));
for (unsigned int i = 0; i < length; ++i)
{
s[i] = letters[rand() % (sizeof(letters) - 1)];
}
s[length] = '\0';
return s;
}
int tab1(void)
{
unsigned int length,i,j,c;
char *str;
for (i = 0; i < 5004; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),1)==false)
{
InsertHash(str,strlen(str),1);
}
}
for (i = 0; i < 2501; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),1)==false)
{
InsertHash(str,strlen(str),1);
}
}
for (i = 0; i <2502 ; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),1)==false)
{
InsertHash(str,strlen(str),1);
}
}
for (i = 0; i <2502 ; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),1)==false)
{
InsertHash(str,strlen(str),1);
}
}
return 1;
}
int tab2(void)
{
unsigned int length,i,j,c;
char *str;
for (i = 0; i < 5000; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),2)==false)
{
InsertHash(str,strlen(str),2);
}
}
for (i = 0; i < 2500; i++)
{
length = min + rand() % (max+1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),2)==false)
{
InsertHash(str,strlen(str),2);
}
}
for (i = 0; i <2500 ; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),2)==false)
{
InsertHash(str,strlen(str),2);
}
}
for (i = 0; i <2500 ; i++)
{
length = min + rand() % (max + 1 - min);
str = stri(length);
if(SearchHash(str,strlen(str),2)==false)
{
InsertHash(str,strlen(str),2);
}
}
return 1;
}
int main()
{
srand(time(0));
tab1();
tab2();
return 0;
}
#4 KIIV
Z je v tom souboru include "Uloha3", je to strukturovaný datový typ pro uložení
zlomku - struct Zlomek Z[]={15,11 ...}. P.S. za ty velké proměnné nemůžu já(radši používám přesné názvy, protože pokud použiji obecné proměnné pak se v tom nemůžu vyznat), ale učitel jazyka C, ten to tak chtěl. Jinak děkuji za rady.
Dobrý den, mám za úkol naprogramovat funkci, která setřídí zlomky, v té funkci void Tridit(struct Zlomek D[], int n, char(*S)(struct Zlomek, struct Zlomek)), je ukazatel na funkci S, která bere dva parametry Struct Zlomek a struct Zlomek. Akorát když ji potom během třídění zavolám S(D[i].citatel,D[j].jmenovatel) tak mi to vyhodí chybu, že argument typu unsigned int je nekompatibilní s typem struct Zlomek. Mohli byste mě takříkajíc trošku "postričit" vpřed abych věděl co mám špatně a jak to opravit předem děkuji.
#include <stdio.h>
#include "Uloha3"
#include<conio.h>
#include<stdlib.h>
void Vypsat(struct Zlomek Z[], int n);
void Tridit(struct Zlomek D[], int n, char(*S)(struct Zlomek, struct Zlomek));
char Vetsi(struct Zlomek z1, struct Zlomek z2);
char Mensi(struct Zlomek z1, struct Zlomek z2);
void main(void)
{
Vypsat(Z, Pocet);
printf("\n");
Tridit(Z, Pocet, Vetsi);
Vypsat(Z, Pocet);
//Tridit(Z, Pocet, Mensi);
//Vypsat(Z, Pocet);
getchar();
getchar();
}
void Tridit(struct Zlomek D[], int n, char(*S)(struct Zlomek, struct Zlomek))
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (S(D[i].citatel,D[j].jmenovatel)==1)
{
struct Zlomek t = D[j + 1];
D[j + 1] = D[j];
D[j] = t;
}
}
}
}
char Vetsi(struct Zlomek z1, struct Zlomek z2)
{
if (z1.citatel*z2.jmenovatel > z2.citatel*z1.jmenovatel)
return 1;
else
return 0;
}
char Mensi(struct Zlomek x1, struct Zlomek x2)
{
if (x1.citatel*x2.jmenovatel < x2.citatel*x1.jmenovatel)
return 1;
else
return 0;
}
void Vypsat(struct Zlomek Z[], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d/%d ", Z[i]);
}
}