Position in einfach verknüpfter Liste in C tauschen
-
20-12-2019 - |
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
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:
- Alter Link:
Node_A -> Node_B
....Neuer Link:Node_A -> Node_D
- Alter Link:
Node_B -> Node_C
....Neuer Link:Node_D -> Node_C
- Alter Link:
Node_C -> Node_D
....Neuer Link:Node_C -> Node_B
- Alter Link:
Node_D -> Node_E
....Neuer Link:Node_B -> Node_E
Denken Sie auch an die Eckfälle wie Nullzeiger und aufeinanderfolgende Knoten.