Frage

Ich habe den Auftrag erhalten, verschiedene Methoden für eine verknüpfte Liste in C zu erstellen.Ich stecke bei der Swap-Methode fest, die nur die gesamte verknüpfte Liste durcheinander zu bringen scheint.Hat jemand einen Rat, wo ich falsch liege?Prost!

Hier ist mein Code.

int main(int argc, char* argv[])
{
    // A list of  pointers to Reminders 
    const int MAX_ENTRIES = 10;
    int numOfEntries = 0 ;
    reminder_t* pFirst = (reminder_t*) malloc ( sizeof(reminder_t));
    reminder_t* pSecond = (reminder_t*) malloc ( sizeof(reminder_t));
    reminder_t* pThird = (reminder_t*) malloc ( sizeof(reminder_t));
    reminder_t* pStart = NULL;
    if (pFirst != NULL)
    {
        strcpy( pFirst->message, "Mikes Birthday");
        pFirst->dateOfEvent.day= 1;
        pFirst->dateOfEvent.month= 1;
        pFirst->dateOfEvent.year= 2013;
        pFirst->pNext = NULL;
    }

    if (pSecond != NULL)
    {   
        strcpy( pSecond->message, "Als Soccer Match");
        pSecond->dateOfEvent.day= 2;
        pSecond->dateOfEvent.month= 2;
        pSecond->dateOfEvent.year= 2013;
        pSecond->pNext = NULL;
    }

    if ( pThird != NULL)
    {
        strcpy( pThird->message, "School Concert");
        pThird->dateOfEvent.day= 3;
    pThird->dateOfEvent.month= 3;
    pThird->dateOfEvent.year= 2013;
    pThird->pNext = NULL;
}

pFirst->pNext = pSecond;
pSecond->pNext = pThird;
pThird->pNext = NULL;
pStart = pFirst;

printf("\n------Before------\n");
listEntries(pStart);
swapPositonOf(pFirst,pThird);

printf("\n------After-aa-----\n");
listEntries(pStart);

getchar();
return 0;
}

void listEntries(reminder_t * pList) 
{
    printf("\n");
    while (pList != NULL)
    {
            printf("%s\n", pList->message);
        pList = pList->pNext;
    }
}

void swapPositonOf(reminder_t* first , reminder_t* second)
{
    reminder_t* pFirst = (reminder_t*) first;
reminder_t* pSecond = (reminder_t*) second;
reminder_t* temp = second->pNext;

pSecond->pNext = pFirst->pNext;
pFirst->pNext = temp;
temp = pSecond;
pSecond = pFirst;
pFirst = temp;
}

Erwartete Leistung:

------Before------

Mikes Birthday
Als Soccer Match
School Concert

------After-aa-----
School Concert
Als Soccer Match    
Mikes Birthday

Ausgabe:

------Before------

Mikes Birthday
Als Soccer Match
School Concert

------After-aa-----

Mikes Birthday
War es hilfreich?

Lösung

Wenn Sie die tauschen möchten Inhalt von den Listenknoten ist es dann nicht schwer:sie können einfach einen Tausch für machen message und dateOfEvent felder in den beiden Knoten.

Aber wenn du das tauschen willst Position von diesen Knoten (wie der Name der Funktion schon sagt), dann müssen Sie auf die achten pNext datenmitglied.
Tatsächlich reicht es nicht aus, nur die Knotenzeiger auszutauschen.
Sie müssen die Positionen der Knoten finden vor first und last, und mach so etwas wie:

/* reminder_t* beforeFirst, reminder_t* beforeSecond */
beforeFirst->pNext = second;
beforeSecond->pNext = first;

und tauschen first->pNext und second->pNext.

Darüber hinaus ist es bei diesen Listenimplementierungen im Allgemeinen wichtig, Folgendes zu beachten Spezialfälle wie Kopfknoten und Schwanzknoten.

Andere Tipps

Sie tauschen es nicht richtig an, was ist mit dem Knoten vor dem ersten Knoten und dem Knoten vor dem zweiten Knoten?

Mit einer einzeln verknüpften Liste können Sie das Listenelement nicht direkt anhand des Elements, das Sie tauschen möchten, nicht direkt suchen.Sie haben zuerst, zweiter, und Sie können sie direkt manipulieren, aber Sie haben nicht First.Prev und Second.Prev.

Sie müssen Ihre Liste durchqueren und die Knoten finden, die vor den beiden Knoten, die Sie tauschen möchten (First_Previous, Second_Previous).Dann müssen Sie den Knoten-Swap auch den nächsten von jedem dieser vorherigen Knoten austauschen.

generasacodicetagpre.

Sie müssen das oben genannte beheben, um eine leere Liste, eine Elementliste zu behandeln, und das erste oder zweite auf der Liste der Liste ...

Sie ändern nicht die pNext zeiger für die Knoten kurz davor first und second Knoten.

Sie müssen auf das zeigen pNext des vorhergehenden Knotens "first knoten" bis "second knoten" und umgekehrt.

Angenommen, die verknüpfte Liste:

Node_A -> Node_B -> Node_C -> Node_D -> Node_E

Sie müssen Node_B und Node_D tauschen:
Gesamte Links zu brechen und zu bilden:

  1. Alter Link: Node_A -> Node_B....Neuer Link: Node_A -> Node_D
  2. Alter Link: Node_B -> Node_C....Neuer Link: Node_D -> Node_C
  3. Alter Link: Node_C -> Node_D....Neuer Link: Node_C -> Node_B
  4. Alter Link: Node_D -> Node_E....Neuer Link: Node_B -> Node_E

Denken Sie auch an die Eckfälle wie Nullzeiger und aufeinanderfolgende Knoten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top