2016-08-30 4 views
-1

Ich mache eine HashMap in C und ich versuche, eine Values ​​() -Funktion zu machen, die Standard in allen HashMaps ist.C - HashMap Values ​​() -Funktion - gebe ich NULL-Werte zurück?

for example

Lassen Sie uns meine HashMap sagen sah wie folgt aus:

(Anmerkung der Schlüsselsatz vom Typ <void*, void*>)

// CAPACITY = 8, SIZE = 4 
[0] <"Pancakes", 24> 
[1] = NULL 
[2] = <"Waffles", 7> 
[3] = NULL 
[4] = NULL 
[5] = NULL 
[6] = <"Eggs", 12> 
[7] = <"Bacon", 99> 

Normalerweise in diesem sitatuion, würde ich ein Array erstellen von size_t5, und es würde wie folgt aussehen.

{ 24, 7, 12, 99, NULL } 

NULL muss hier sein, oder aber nachdem ich das Array zurück, die Schleife, die durch das Feld zu gehen versucht, wird nicht zu wissen, die Lage sein, wann man aufhören muss.

Was wäre, wenn ich Folgendes hätte?

// CAPACITY = 8, SIZE = 4 
[0] <"Pancakes", 24> 
[1] = NULL 
[2] = <"Waffles", NULL> 
[3] = NULL 
[4] = NULL 
[5] = NULL 
[6] = <"Eggs", 12> 
[7] = <"Bacon", 99> 

Plötzlich sieht mein Array wie folgt aus:

{ 24, NULL, 12, 99, NULL } 

Und wenn ich versuchen würde, das drucken, nachdem sie zurückgekehrt war, würde es die folgenden drucken:

24 

Wie soll ich mit diesem Problem umgehen? Sollte ich einfach NULL Werte ignorieren? Wenn ja, meine HashMap könnte eine size von 4 haben und der Programmierer erwartet 4 Werte von meiner Values() Funktion, und ich gebe ihm nur ein Array der Größe 3. Und nein, ich möchte wirklich nicht eine struct machen, um mehrere Variablen zurück wie size und das Array übergeben

+0

Ihre Frage ist nicht klar. '<" Waffles ", NULL>' Das ist kein gültiger C-Code, daher ist nicht klar, was Sie dort darstellen wollen. Was soll dieses 'NULL' darstellen? Und wofür soll das Array sein, auf das du dich immer beziehst? Es ist wirklich nicht klar, was Ihre Idee von einer HashMap-Implementierung ist. A [mcve] würde wahrscheinlich Dinge klären. – kaylum

+1

Dies scheint nicht wie eine Hash-Map in dem Sinne, dass Sie die Werte in sequenzieller Reihenfolge auflisten und eine Hash-Map nicht unbedingt das tun. Sie können nicht davon ausgehen, dass die Werte in aufeinanderfolgenden Zeitschlitzen in der Tabelle liegen. – templatetypedef

+0

Lassen Sie mich klären. Der obige Code ist absichtlich kein gültiger C-Code. Ich wollte die Dinge nicht mit irrelevantem Code verkomplizieren. Stattdessen wollte ich ein theoretisches Problem beschreiben. <"Bacon", 99> ist ein 'struct Node' mit zwei' void * 'Feldern. Das bedeutet, dass mein 'Schlüssel' oder' Wert' 'NULL' sein kann, was in einer' HashMap' akzeptabel ist, aber nicht in einer 'HashTable'. Hoffentlich klärt das alle Bedenken auf. – Hatefiend

Antwort

0

Um dieses Problem zu lösen, werde ich einfach <Key, Value> Nodes anstelle von nur Keys oder Values zurückgeben. In meinem Programm muss ich mich nicht mit NULLNodes befassen, so vermeide ich das Problem von NULLKeys und Values vollständig. Wenn ich mit einer der vorgeschlagenen Methoden gehen müsste, würde ich Kaylums Vorschlag verwenden.

Danke euch allen.

0

Sie haben mehrere Optionen für Arrays unterschiedlicher Größe Anrufer Rückkehr, abgesehen von der Rückkehr eines struct :

  • Haben der Anrufer Sie ein Array und eine maximale Größe, übergeben und size_t zurückkehren - diese Option muss der Anrufer die Array zuweisen, die statisch durchgeführt werden.
  • Übergeben Sie einen Zeiger auf das Rückgabearray, und geben Sie die Größe zurück - Dies erfordert, dass der Aufrufer das Array rückgängig macht, das von Ihrer Funktion zurückgegeben wird.
  • Sie könnten ein NULL -terminiertes Array zurückgeben - dieser Ansatz erfordert auch, dass der Aufrufer das Ergebnis freigibt, aber die Größe muss nicht zurückgegeben werden.

Rückkehr NULL s innerhalb der Daten, und Anweisen der Anrufer über sie zu überspringen, ist eine sehr verwirrende Wahl, die Ihnen nichts im Gegenzug nicht geben: Sie sind immer noch erforderlich, um den Anrufer zu sagen, wie groß das zurückgegebene Array ist und die Option NULL -termination ist deaktiviert.

+0

Mann Ich wollte wirklich keine Parameter für diese Funktion neben der 'HashMap' haben. Ich denke, ich kann nicht alles haben. Klar, obwohl Methode Nummer 2 nicht richtig funktioniert? – Hatefiend

+0

@Hatefiend, die ein 'NULL'-terminiertes Array zurückgibt, können Sie eine Funktion ohne Parameter haben. – dasblinkenlight

0

Eine Option besteht darin, einen Sentinel-Wert zu verwenden, der niemals Teil des Wertsatzes ist.Zum Beispiel erklären anstelle von NULL, eine Dummy-Variable (jeglicher Art) und seine Adresse als Sentinel Wert verwenden:

int dummy; 
void *sentinel = &dummy; 

und ein Beispiel Wert Array wäre:

{ 24, NULL, 12, 99, sentinel } 

Der sentinel Wert ist dann Teil der API, die von der HashMap-Implementierung exportiert wurde, und der Clientcode würde nach diesem Wert suchen, um das Ende des Wertearrays zu bestimmen.

+0

Ich habe das Gefühl, dass der Programmierer, der meine Hash-Karte benutzt, 'Sentinel' zu verwenden, ein ziemlich großes Opfer ist. Umfassen andere Sprachen bei der Rückgabe von 'Values ​​()' sogar NULL-Werte? – Hatefiend

+0

Wie ist es ein großes Opfer? Anstatt dem Benutzer mitzuteilen, dass "NULL" das Ende des Arrays angibt, sagen Sie ihm, dass es "sentinel" ist. Genauso wie einige Standard-Dateifunktionen einen speziellen "EOF" -Wert verwenden. Wenn Sie das nicht mögen, dann ist Ihre andere Alternative, eine explizite Größe zu übergeben (die Sie auch nicht mögen). Macht es schwierig, Ihre Frage zu beantworten, wenn Sie nicht angeben, was Sie für akzeptabel oder inakzeptabel halten. Aber das sind die zwei Hauptoptionen - Größe oder Sentinel. – kaylum

+0

@Hatefiend Ich denke, eine andere Alternative ist, die Größe als erstes Element im Array Werte zu haben.Nicht so sauber wie die anderen Alternativen meiner Meinung nach, aber es wird funktionieren. – kaylum

Verwandte Themen