C++ seule liste liée à l'aide d'une des classes
Je veux créer individuellement liée liste (à l'aide de classes), où, dans chaque liste, il y aura: pointeur de texte,int nombre, pointeur vers la prochaine liste.
J'ai besoin pour mettre en œuvre 3 fonctions:
inserts(qui insère une liste dans liste individuellement liée et trie les éléments avec strcmp selon le texte qui est pointé par le pointeur)
supprime(int num) qui supprime la première liste dont le numéro de produit.
print() qui imprime toute seule liste liée.
J'ai un problème avec supprime la fonction qui donne une erreur lors de l'exécution et j'ai une conjecture où est le problème if ( tmp->next == NULL && tmp->number==num ) {
, mais je n'ai aucune idée de pourquoi est-il si .
delete tmp;
first = NULL;
}
Aussi je ne suis pas sûr de savoir comment dois-je mettre en œuvre le tri en fonction d'insertion, donc si vous avez des idées et si vous pouviez m'expliquer, si j'enlève la fonction de l'erreur est que je voudrais vraiment l'apprécier.
Voici le code:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
class list
{
private:
int number;
char* word;
list* next;
public:
void inserts(int num, char* text);
void removes(int num);
void print();
};
list* first;
void list::print() {
cout <<"This is our list:"<<endl;
//Temp pointer
list *tmp = first;
//No nodes
if ( tmp == NULL ) {
cout << "EMPTY list" << endl;
return;
}
//One node in the list
if ( tmp->next == NULL ) {
cout <<"NUMBER:\t"<< tmp->number;
cout <<"\tWORD:\t"<< tmp->word << endl;
cout <<"--------------------------------"<<endl;
}
else {
//Parse and print the list
while ( tmp != NULL ){
cout <<"NUMBER:\t"<< tmp->number;
cout <<"\tWORD:\t"<< tmp->word << endl;
cout <<"--------------------------------"<<endl;
tmp = tmp->next;
}
}
}
void list::inserts(int num, char* word){
//Create a new list
list* newlist = new list;
newlist->number=num;
newlist->word=word;
newlist->next=NULL;
//Create a temp pointer
list *tmp = first;
if ( tmp != NULL ) {
//Nodes already present in the list
//Parse to end of list
while ( tmp->next != NULL ) {
tmp = tmp->next;
}
//Point the last node to the new node
tmp->next=newlist;
}
else {
//First node in the list
first = newlist;
}
}
void list::removes(int num){
int k = 0;
list* tmp=first;
if(tmp==NULL)
return;
//Last node of the list
if ( tmp->next == NULL && tmp->number==num ) {
delete tmp;
first = NULL;
}
else {
//Parse thru the nodes
list* prev;
prev = new list;
while ( tmp != NULL )
{
if ( tmp->number == num && k == 0)
first = first->next;
if ( tmp->number == num)
break;
prev = tmp;
tmp = tmp->next;
k++;
}
//Adjust the pointers
prev->next=(tmp->next);
//Delete the current node
delete tmp;
delete prev;
}
}
int main ()
{
first->print();
first->inserts(1200,"endian");
first->print();
/* first->inserts(10,"endianness");
first->inserts(1200,"PEEK");
first->inserts(1200,"POKE");
first->inserts(1200,".MIL");
first->print();*/
first->removes(100);
first->print();
getchar();
}
- "pointeur de texte" pourquoi?? C'est seulement dans de très spécifique cicumstances raisonnable de ne pas utiliser
std::string
, et dans votre cas,char*
complique les choses, sans les avantages. - Apparemment, C++ qui est enseigné avec char* 15 ans après la STL. Déprimant.
Vous devez vous connecter pour publier un commentaire.
Se débarrasser de la
delete prev;
dans la dernière ligne de laremoves()
fonction.Je ne suis pas expert, mais en supprimant prev vous sont en train de perdre la référence à votre premier nœud de la liste.
Par ailleurs, de bonnes observations, il est très facile à lire!
Dans
removes
, après la bouclewhile ( tmp != NULL ) { … }
,tmp
est peut-être NULL.Mais, après cette boucle, vous avez ces lignes:
Vous êtes un déréférencement d'un pointeur NULL, ce qui provoque vos planter le programme.
Remplacer ces lignes avec ces:
À noter également: vous avez encore un bug dans la gestion de la mémoire dans la
removes
routine. Vous n'appelez jamaisdelete
sur la valeur initiale deprev
, et vous supprimez une liste de nœud que vous devez garder dans certains cas. Au lieu de ce que vous faites, initialiser ainsi:list* prev=0;
, et de se débarrasser dedelete prev
.tmp = tmp->next
finalement trouve la fin de la liste.Lorsque cette boucle s'exécute:
tmp pointeur sera d'atteindre la fin de la liste, et sera NULLE lorsque la boucle de pauses.
Donc, lorsque vous exécutez :
votre temp pointeur de ne pas avoir un "à côté" de la valeur. Peut-être que vous devriez maintenir un autre pointeur en dehors de la boucle.