2017-07-15 11 views
-1

Mein Funktionseinsatz funktioniert nicht, nachdem ich einige Sortiermethoden angewendet habe, die ich bei Google bekommen habe (http://teknosrc.com/linked-list-in-c-insertion-sort/).C - Segmentierungsfehler - Einfügung_Sortierungsfunktion der verketteten Liste

Erstens sind die Strukturen, die ich an, es benutzen werde:

// This is the Node , where will be stored the item 

struct no 
{ 
     Item * item; 
     struct no *prox; 
}; 
typedef struct no No; 

//This is the list, where will have the head node(No) 

struct lista 
{ 
     char *nomeLista; //This is just a name of the list 
     No *cabeca; //This is the head node 
     int tamanho; //This is the amount of items inserted (forgot to implement this) 
     struct lista *prox; //This is the next list 
}; 
typedef struct lista Lista; 

//This is just the main list that will guard all the list of nodes in a linked way. No need to worry about this. 

struct vetorListas 
{ 
     Lista *cabeca; //head list 
     int tamanho; //amount of lists 
}; 
typedef struct vetorListas VetorListas; 

//This is the item to be inserted 

struct item 
{ 
     int id; //the ID used for the comparison of sort 
     char *nome; //just the name of it 
}; 
typedef struct item Item; 

In dieser Funktion nomeDaList ist ein String (char *) verwendet, um die Liste zu finden, indem andere Funktion und i ist die Item :

void * 
insert(void * nomeDaLista, Item * i) 
{ 
    Lista * auxLista; //the list 
    auxLista = idl(nomeDaLista); //the function to get the list by it's name. It works, no worries. 


    //down here, is the sequence of codes translated to my program (got by the website I showed before) 

    No * temp = auxLista->cabeca; 
    No * prev = NULL; 
    No * ptr; 

    Item * itemTemp; 
    itemTemp = temp->item; 

    ptr = criaNo(i); //this function creates (makes the malloc and all) a node (No) and return the created node. 



    if(temp == NULL) 
    { 
     ptr->prox=NULL; 
     auxLista->cabeca = ptr; 
     return auxLista; 
    } 

    if(i->id < itemTemp->id) 
    { 
     ptr->prox = auxLista->cabeca; 
     auxLista->cabeca = ptr; 
     return auxLista; 
    } else 
    { 
     while(temp != NULL) 
     { 
      if(i->id > itemTemp->id) 
      { 
       prev = temp; 
       temp = temp->prox; 
       continue; 
      } else 
      { 
       prev->prox = ptr; 
       ptr->prox = temp; 
       return auxLista; 
      } 
     } 

     prev->prox = ptr; 
    } 
}  

Bitte helfen Sie mit dieser Segmentierung Fehler (Core Dumped).

+0

'if (temp == NULL)': Sie haben 'temp' bereits bei' itemTemp = temp-> item; 'verwendet. – BLUEPIXY

+0

..die Sie hätten sehen können, wenn Sie Ihren Debugger verwendet hätten :( –

+0

Also, sollte ich Kommentar if (temp == NULL)? Könnte immer noch nicht verstehen, was zu tun ist ... und es tut mir leid, ich habe keine IDE und Ich kann nicht mit gdd umgehen. –

Antwort

0

Sie haben einen Scheck in dieser Linie
if(temp == NULL)
die sollte, und normalerweise würde, schützen Sie gegen segfaults von über NULL-Zeiger zugreifen.
Allerdings dereferenzieren Sie schon ein paar Zeilen zuvor die unkontrollierte temp, zweimal.
itemTemp = temp->item;
und
No * temp = auxLista->cabeca;

sollten Sie den Code ändern, um sicherzustellen, dass diese Linien nur noch ausgeführt werden, wenn tmp nicht-NULL ist. Z.B. Teilen Sie die Variablendefinition und ihre Initialisierung und verschieben Sie die Init nach der Check-Zeile.

Sie erhalten auch einen Zeiger von einer Funktion criaNo(i) und verwenden Sie es ein paar Zeilen später, ohne es gegen NULL zu überprüfen.
ptr->prox=NULL;
Es ist nicht klar, ob das garantiert nicht NULL ist. Sie müssen diese Funktion "entpacken", d. H. Im Detail prüfen, ob NULL zurückgegeben werden kann.

Hier ist eine nette Beschreibung, wie man (meistens) ohne einen Debugger debuggt, auch erklärt "Gummi-Ducking". https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

Für Ihr Problem, nicht zu wissen, wie man einen Debugger verwenden:
How to debug using gdb?

Für Ihr Problem nicht ein IDE:
ein Finden, speichern Schmerz.
Meine Lieblingssuchmaschine gibt (für "freie IDE c") meine momentan verwendete freie IDE als erste Übereinstimmung, die, die ich denke, als dritte zu wechseln.

Verwandte Themen