Ich habe den folgenden Code (richtig für meine einfachen Tests) für eine verknüpfte Liste für keine Duplikate, aber ich denke, es ist ein bisschen hässlich.verknüpfte Liste ohne Duplikate
Kann jemand einen saubereren Weg empfehlen, den doppelten Code zu behandeln? Das aktuelle Stück in Frage:
if((val == cur->val) || (cur->next && (val == cur->next->val)))
Aber ich denke, dass eine bessere Lösung geben könnte (die ich nicht sehen), eine andere Verwendung von Vergleichsoperatoren verwenden.
Auch kann mir jemand einen Vorschlag für eine "nützliche" Behauptung oder nach innen hier geben. Es ist schwer zu sagen, wann man etwas behaupten soll, besonders wenn du eine if-Anweisung hast, die es für dich tut.
struct Node
{
Node(int v):val(v),next(NULL){}
int val;
Node * next;
};
void insert(Node ** ppHead, const int val)
{
if(ppHead == NULL)
return;
if(*ppHead == NULL || val < (*ppHead)->val)
{
Node * tmp = new Node(val); // new throws
tmp->next = *ppHead;
*ppHead = tmp;
}
else
{
Node * cur = *ppHead;
while(cur->next && (val > cur->next->val))
cur = cur->next;
if((val == cur->val) || (cur->next && (val == cur->next->val)))
return;
Node * tmp = new Node(val); // new throws
tmp->next = cur->next;
cur->next = tmp;
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node * list = NULL;
int x[] = { 5, 4, 6, 7, 1, 8, 1, 8, 7, 2, 3, 0, 1, 0, 4, 9, 9 };
int size = sizeof(x)/sizeof(x[0]);
for(int i = 0; i < size; i++)
insert(&list, x[i]);
Node * cur = list;
while(cur) {
printf (" %d", cur->val);
cur = cur->next;
}
printf("\n");
return 0;
}
Vielleicht verwenden Sie die falsche Datenstruktur für den Job. Müssen Sie beispielsweise Ihre Knoten in einer bestimmten Reihenfolge speichern? Wenn nicht, ist es ganz einfach, den Code mithilfe einer Hashtabelle oder eines ausgeglichenen Binärbaums neu zu schreiben. – Juliet
Danke Julia, aber es war eine Programmierfrage. ;-) Kein echtes Problem, das ich hatte. – teleball