2012-05-11 2 views
0

Я понимаю, что есть лучшие способы делать то, что я пытаюсь, но это вопрос в книгу, которую я использую, чтобы изучить C++, и это поможет мне понять некоторые из основ, прежде чем двигаться дальше. Во всяком случае, вот мой код:Попытка реализовать функцию для удаления структуры в связанном списке при назначении структуры до ее указания на структуру после нее

#include <iostream> 

using namespace std; 

struct EnemySpaceShip 
{ 
    int weapon_power; 
    int xcoord; 
    int ycoord; 
    EnemySpaceShip *nextEnemy; 
}; 

EnemySpaceShip* getNewEnemy(EnemySpaceShip* p_enemies) // Creates a new EnemySpaceShip in linked list p_enemies 
{ 
    EnemySpaceShip *p_ship = new EnemySpaceShip; 
    p_ship->xcoord = 0; 
    p_ship->ycoord = 0; 
    p_ship->weapon_power = 10; 
    p_ship->nextEnemy = p_enemies; 
    p_enemies = p_ship; 
    return p_ship; 
} 

EnemySpaceShip* findPreRemove(EnemySpaceShip* p_enemies, int x_attack, int y_attack) // finds the element that is before the ship to be removed or returns NULL 
{ 
    EnemySpaceShip *p_current = p_enemies; 
    EnemySpaceShip *initialShip = p_enemies; 
    int i= 0; 
    while (p_current != NULL) 
    { 
     i++; 
     if (p_current->xcoord == x_attack && p_current->ycoord == y_attack) 
     { 
      if (i == 1) 
      { 
       delete initialShip; 
       delete p_current; 
       return NULL; 
      } 
      else 
      { 
       for (int j = 1; j < i - 1; j++) 
       { 
        initialShip = initialShip->nextEnemy; 
       } 
       delete p_current; 
       return initialShip; 
      } 
     } 
     p_current = p_current->nextEnemy; 
    } 
    return NULL; 
} 

EnemySpaceShip* findRemove(EnemySpaceShip* p_enemies, int x_attack, int y_attack) 
{ 
    EnemySpaceShip *p_current = p_enemies; 
    while (p_current != NULL) 
    { 
     if (p_current->xcoord == x_attack && p_current->ycoord == y_attack) 
     { 
      return p_current; 
     } 
     p_current = p_current->nextEnemy; 
    } 
} 

EnemySpaceShip* removeEnemyShip(EnemySpaceShip *p_ship) // deletes the ship parameter and returns the ship after it in the list 
{ 
    EnemySpaceShip *enemyAfterRemove = new EnemySpaceShip; 
    enemyAfterRemove = p_ship->nextEnemy; 
    delete p_ship; 
    return enemyAfterRemove; 
} 

int main() 
{ 
    EnemySpaceShip *p_enemies = NULL; 
    EnemySpaceShip *Ship1 = getNewEnemy(p_enemies); 
    EnemySpaceShip *Ship2 = getNewEnemy(p_enemies); 
    EnemySpaceShip *Ship3 = getNewEnemy(p_enemies); 

    Ship3->xcoord = 5; //arbitrary numbers to test the code 
    Ship3->ycoord = 5; 

    EnemySpaceShip *ShipBeforeRemove = findPreRemove(p_enemies, 5, 5); 
    EnemySpaceShip *ShipToRemove = findRemove(p_enemies, 5, 5); 
    ShipBeforeRemove->nextEnemy = removeEnemyShip(ShipToRemove); 
} 

Я использую произвольные значения для тестирования программы, мне не нужно, чтобы полностью реализовать это как функциональные возможности для игры, что он, видимо, используется для. Буду признателен за любую оказанную помощь.

+0

Я не могу получить этот вопрос) – superM

+0

Вашей структура только указует вперед, так вы теряете «корабль перед этим» - держите указатель наподобие 'p_last'. Если вы не сделаете это двусторонним (указатель до и после), вы не сможете удалить элемент без предварительного контекста. – Greyson

ответ

0

Я надеюсь, что следующий, что вы хотите .. Удаление элемента из односвязного списка ..

EnemySpaceShip* removeFromList(EnemySpaceShip* p_enemies, int x_attack, int y_attack) 
{ 
    if(p_enemies == NULL) 
     return NULL; 

    EnemySpaceShip *p1 = p_enemies; 
    EnemySpaceShip *p2 = p1->next; 

    if(p2 == NULL) 
    { 
     // Trivial case.. 

     if(p1->xcoord == x_attack && p1->ycoord == y_attack) 
     { 
      delete p_enemies; 
      p_enemies = NULL; 
     } 

     return NULL; 
    } 

    while(p2 != NULL) 
    { 
     if(p2->xcoord == x_attack && p2->ycoord == y_attack) 
     { 
      // Element found, remove it and assign its previous pointer 
      // as the next pointer of the deleted one.. 
      p1->next = p2->next; 
      delete p2; 
      return p1; 
     } 
     else 
     { 
      p1 = p2; 
      p2 = p2->next; 
     } 
    } 

    return NULL; 

}

+0

Большое спасибо за ввод, проблема заключалась в том, что функция просто взяла корабль, который должен был быть удален как параметр. Я думаю, что проблема создает ситуацию, которая не должна быть настолько сложной и нечеткой, если не считать смысла упражнения. Код, который вы связали, более реалистичный способ сделать это, и я думаю, что я готов просто принять это и двигаться дальше, вместо того, чтобы болтаться на несущественных особенностях этого вопроса. Большое спасибо за ваше понимание и время. –

+0

@BlakeMadden: неважно .. :) – Ammar

Смежные вопросы