J'ai implémenté un tri d'insertion dans une liste de liens doubles (du plus élevé au plus bas) à partir d'un fichier de 10 000 ints, et de le sortir dans le fichier dans l'ordre inverse. À ma connaissance, j'ai mis en œuvre un tel programme, mais j'ai remarqué dans le fichier de sortie, un seul numéro est hors de propos. Tous les autres numéros sont dans le bon ordre.Bogue de tri par insertion de liste à liens doubles
Le numéro déplacé est un nombre répété, mais les autres répétitions de ce nombre sont dans le bon ordre. C'est juste étrange comment ce numéro est incorrectement placé. De plus, le nombre non trié n'est que 6 places désynchronisées.
J'ai regardé mon programme depuis des jours sans aucune idée de l'origine du problème, alors je me tourne vers vous pour obtenir de l'aide.
Voici le code en question,
(Note: can ma question est supprimé par moi-même plutôt mes collèges DonT thieve mon code, sinon comment peut-il être supprimé)
void DLLIntStorage::insertBefore(int inValue, node *nodeB)
{
node *newNode;
newNode = new node();
newNode->prev = nodeB->prev;
newNode->next = nodeB;
newNode->value = inValue;
if(nodeB->prev==NULL)
{
this->front = newNode;
}
else
{
nodeB->prev->next = newNode;
}
nodeB->prev = newNode;
}
void DLLIntStorage::insertAfter(int inValue, node *nodeB)
{
node *newNode;
newNode = new node();
newNode->next = nodeB->next;
newNode->prev = nodeB;
newNode->value = inValue;
if(nodeB->next == NULL)
{
this->back = newNode;
}
else
{
nodeB->next->prev = newNode;
}
nodeB->next = newNode;
}
void DLLIntStorage::insertFront(int inValue)
{
node *newNode;
if(this->front == NULL)
{
newNode = new node();
this->front = newNode;
this->back = newNode;
newNode->prev = NULL;
newNode->next = NULL;
newNode->value = inValue;
}
else
{
insertBefore(inValue, this->front);
}
}
void DLLIntStorage::insertBack(int inValue)
{
if(this->back == NULL)
{
insertFront(inValue);
}
else
{
insertAfter(inValue, this->back);
}
}
ifstream& operator>> (ifstream &in, DLLIntStorage &obj)
{
int readInt, counter = 0;
while(!in.eof())
{
if(counter==dataLength) //stops at 10,000
{
break;
}
in >> readInt;
if(obj.front != NULL)
{
obj.insertion(readInt);
}
else
{
obj.insertBack(readInt);
}
counter++;
}
return in;
}
void DLLIntStorage::insertion(int inValue)
{
node* temp;
temp = this->front;
if(temp->value >= inValue)
{
insertFront(inValue);
return;
}
else
{
while(temp->next!=NULL && temp!=this->back)
{
if(temp->value >= inValue)
{
insertBefore(inValue, temp);
return;
}
temp = temp->next;
}
}
if(temp == this->back)
{
insertBack(inValue);
}
}
Merci pour votre temps.
Vous ne pouvez pas supprimer vos questions. Les structures de données complètement usuelles ne sont pas souvent volées. – Potatoswatter
Ok merci, je suppose que je suis plutôt défensive autour de mon code. – House
Pourquoi ne pas utiliser la bibliothèque de modèles standard, c'est très bien. – martsbradley