Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hashtable in reinem C

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
23.09.2003, 22:35 Uhr
~gast
Gast


Ich suche eine Hashtable Implementierung, die mögliche threadsafe ist und mit gcc kompilierbar ist. Kennt jemand so etwas ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.09.2003, 22:53 Uhr
Pablo
Supertux
(Operator)


Die Tabelle selbst würde ich mit einem Array machen. Oder vielleicht auch mit einer Single Linked Liste, wenn ich speichern will, welche andere Schlüssel verdrängt wurden, wenn man den Brents-Algorithmus benutzt und ab und zu einige Schlüssel wieder herstellen muss.

Für normales Hashing mit einer Funktion oder einer Funktion würde ich nur ein Array nehmen.


C++:
// sagen wir mal, x ist die Anzahl der Schlüssel
int i, x, *hash_tabelle;
// ..... hier erfahren wir, was x ist.
hash_tabelle = (int*) malloc(sizeof(int)*x);
// hier hash_tabelle als array benutzen

free(hash_tabelle); // nicht vergessen


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.09.2003, 23:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Googlen hilft
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 23.09.2003 um 23:06 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.09.2003, 23:35 Uhr
Pablo
Supertux
(Operator)


Wie wäre es damit?


C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

int key_pos(int key, int length){
  return key % length;
}

int main()
{
  int i, laenge, key, pos, *hash_tabelle;
  char folge[1024], *eingabe;
  printf("Geben Sie eine Folge von positiven ganzen Zahlen durch \" \" getrennt ein:\n");
  scanf("%[^\n]s", folge);
  printf("Geben Sie die Anzahl der Schlüssel ein: ");
  scanf("%d", &laenge);
  
  hash_tabelle = (int*) malloc(sizeof(int)*laenge);
  if (hash_tabelle == NULL) {
    fflush(stderr);
    fprintf(stderr, "Upsssss. Mangel an Speicher...\n");
    return 1;
  }
  
  // die hash-tabelle hat überall -1 als leer
  for(i=0; i<laenge; ++i)
    hash_tabelle[i]=-1;

  eingabe = strtok(folge, " ");
  i=0;
  while(eingabe != NULL) {
    key = atoi(eingabe);
    pos = key_pos(key, laenge);
    while(hash_tabelle[pos] != -1) {
      --pos;
      if (pos == -1) pos = laenge-1;
    }
    hash_tabelle[pos] = key;
    eingabe = strtok(NULL, " ");
  }

  printf("| ");
  for(i=0; i<laenge; ++i)
    printf("%d | " , hash_tabelle[i]);
  printf("\n");

  free(hash_tabelle);
  
}



Gib
12 4 5 7 56 9 5 4 7 1
10
Ausgabe:
| 7 | 4 | 12 | 5 | 4 | 5 | 56 | 7 | 1 | 9 |


Bearbeitung:

Oder
1 2 3 4 5
5
Ausgabe:
| 5 | 1 | 2 | 3 | 4 |


Ich hab zuerst so versucht:

C++:
  printf("Geben Sie die Anzahl der Schlüssel ein: ");
  scanf("%d", &laenge);
  printf("Geben Sie eine Folge von positiven ganzen Zahlen durch \" \" getrennt ein:\n");
  scanf("%[^\n]s", folge);



Wieso wird die zweite scanf Anweisung übersprungen? Die wird nicht ausgeführt. Aber wenn ich [^\n] lösche, dann wird sie nicht übersprungen. Wieso?


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 23.09.2003 um 23:39 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.09.2003, 09:41 Uhr
~(un)wissender
Gast


Hi Pablo!

Schreib mal statt folge &folge, dann wird scanf auch nicht mehr "übersprungen"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.09.2003, 15:10 Uhr
Pablo
Supertux
(Operator)


Nein, man schreibt &, wenn man die Adresse eine Variable übergeben will, aber in diesem Fall brauche ich das nicht, weil folge ein Array ist, also passiert das noch weiter. Ich hab sowieso so getestet und funz. auch nicht. Es liegt an [^\n], weil wenn ich das weg mache, dann funktioniert es.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.09.2003, 15:18 Uhr
virtual
Sexiest Bit alive
(Operator)


Wird übersprungen, weil das erste scanf das Newline im Eingabepuffer läßt (%d matcht kein Newline, also wird es nicht mit ausgelesen).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.09.2003, 15:32 Uhr
Pablo
Supertux
(Operator)


Und wie wäre es in diesem Fall das Problem lösen?

Bearbeitung:
Gibt es eine Möglichkeit das Eingabepuffer zu löschen oder wie vorher einzustellen?

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 24.09.2003 um 15:39 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.09.2003, 15:52 Uhr
virtual
Sexiest Bit alive
(Operator)


fgetc(stdin) nach dem ersten scanf Einfügen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.09.2003, 16:05 Uhr
Pablo
Supertux
(Operator)


Ach ja, so hat's funktioniert und es war einfacher als ich dachte.... wieso kam ich nicht alleine dazu?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: