Programmera spel i C++ för nybörjare/Länkad lista 2

Från Wikibooks


Gå igenom kön[redigera]

Koden inspirerad av artikel: http://www.gamedev.se/artiklar/media/lankadelistor/lankadelistor.pdf


Nu vet vi hur vi lägger in spelare i kön, och även om en speciell spelare finns i kön. Men anta att man vill gå igenom alla sälar i listan för att t.ex. se vilken y-koordinat de har? Då kan man använda följande funktion:

void TraverseList()
{//Börja att gå igenom listan
 seal *Temp = Head; //Börja vid huvudet
 while (Temp != NULL) //Så länge det finns en fiende i kön
   {
   std::cout << Temp->spelare_y <<std::endl; //Skriv ut y-koordinat
   Temp = Temp->Next; //Gå till nästa deltagare i kön
   }
} //Sluta att gå igenom listan

Ta bort en säl[redigera]

Anta att du skjutit ihjäl en säl, då skall den bort ur listan. Hur går det till?

  • 1. Hitta sälen som ska tas bort
  • 2. Länka föregående säl i kön med sälen framför den som skall dö (länka ur sälen som ska tas bort)
  • 3. Ta bort sälen

Enkelt, man kan använda följande kod:

void DeleteNode(int ID) 
{
seal *Temp = Head; //Skapa en temporär pekare till huvudet
if (Head == 0) //Om det inte finns=tom kö, avbryt
return;
while (Temp != 0&& Temp->ID != ID) //Om det finns folk i kön men ID är fel
Temp = Temp->Next; //Gå vidare
if (Temp == 0) //Om temp inte finns = tom kö, avbryt
return;
if (Head == Tail)//Finns bara en i ledet 
{
delete Head; //Radera huvudet
Head = 0; //Nollställ huvud och svans
Tail = 0; //-"-
}
else if (Temp == Head) //Om huvudet = temp = först i ledet
{
Head = Head->Next; //Tryck tillbaka head ett steg
delete Temp; //Radera temp 0 radera huvudet
}
else if (Temp == Tail) //Om svansen skall raderas
{
Temp->Previous->Next = 0; //Tryck tillbaka svansen ett steg
Tail = Temp->Previous; //Sätt temp som sist i ledet
delete Temp; //radera temp
}
else //Id stämmer och det är en säl i kön
{
Temp->Previous->Next = Temp->Next; //Koppla ur sälen ur kön
Temp->Next->Previous = Temp->Previous; //Koppla ur sälen ur kön
delete Temp; //Radera sälen
}
}


Pröva om det fungerar med:

DeleteNode(2); //Radera säl 2
TraverseList(); //Gå igenom listan för att se om den är borta

Anta slutligen att du vill sätta in en säl inuti kön på en plats som inte är längst fram eller längst bak. Man kan göra så här:

  • 1. Hitta platsen där sälen ska sättas in
  • 2. Koppla ihop de två närliggande sälarna med den nya sälen
  • 3. Koppla ihop den nya sälen med de två närliggande sälarna

Koden är som följer:

void InsertNode(int ID, seal *NewNode)
{
seal *Temp = Head; //Temporär säl kopplas till huvudet
if (Head == 0 && Tail == 0)//Om det inte finns någon kö
{
Head = NewNode; //Sälen är både tail och head, ensam i kön
Tail = NewNode;
}
while (Temp != 0 && Temp->ID != ID) //Om det finns fler sälar
Temp = Temp->Next; //Gå till nästa säl i kön
if (Temp == 0)//Finns ingen säl, så avbryt
return;
Temp->Previous->Next = NewNode; //Koppla in sälen som nummer två
NewNode->Previous = Temp->Previous; //Koppla in sälen som nummer två
Temp->Previous = NewNode;
NewNode->Next = Temp; 
}


Skall man sedan koppla in säl 5 framför säl 4 i kön skriver man bara:

InsertNode(seal5->ID, seal4); //Placerar säl fem framför säl 4