2016-09-10 4 views
-3

я получил эти дваКак создать связанный список в C++?

Структуры
struct CamelZombie{ 
    int hp; 
    int attack; 
    CamelZombie *next; 
}; 

struct list_of_cz{ 
    CamelZombie *head; 
}; 

Я сделал функцию, чтобы создать связанный список с заданным значением:

void createCamelZombie(list_of_cz *&pZ, int z_hp, int z_attack, int N){ 
    pZ = new list_of_cz; 
    pZ->head->hp = z_hp; 
    pZ->head->attack = z_attack; 
    CamelZombie *temp1 = pZ->head; 
    CamelZombie *temp2 = NULL; 
    for (int i = 0; i < N - 1 ; i++){ 
     temp2 = new CamelZombie; 
     temp2->hp = z_hp; 
     temp2->attack = z_attack; 
     temp1->next = temp2; 
     temp1 = temp2; 
    } 
} 

Тогда я положил его в функции магистрали, как это, но тогда propram разбился , не знаю почему.

list_of_cz *pZ = NULL; 
createCamelZombie(pZ, z_hp, z_attack, N); 
    while (pList->head != NULL && pZ != NULL){ 
     atPlant(numPlant(pList) - 1, pList)->hp -= pZ->head->attack; 
     if (atPlant(numPlant(pList) - 1, pList)->hp <= 0) deletePlant(numPlant(pList) - 1, pList); 
     int count = 0; 
     CamelZombie *z_temp; 
     z_temp = pZ->head; 
     while (z_temp){ 
      if (count == 0) z_temp->hp -= allPlantAttack(pList, numPlant(pList) - 1); 
      else z_temp->hp -= allLaserAttack(pList); //trouble right here 
      if (z_temp->hp <= 0) deleteCamelZombie(pZ, count); 
      z_temp = z_temp->next; 
      count++; 
     } 

Кажись, как я пропустил что-то при написании void createCamelZombie() потому что компилятор говорит мне, что z_temp->hp не имеет значения. Пожалуйста, помогите мне!

+1

Опубликовать сообщение об ошибке дословно пожалуйста! –

+0

+ \t \t pZ-> head \t 0xcdcdcdcd {hp = ??? атака = ??? следующая = ??? } \t CamelZombie * Компилятор говорит мне об этом –

+1

* Это принадлежит ** в вашем вопросе ***. (как и [минимальный, полный и проверяемый пример] (https://stackoverflow.com/help/mcve), который вы в настоящее время не предоставляете. Что касается этого, казалось бы, нечетного значения [вы можете найти ** это ** (http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations). – WhozCraig

ответ

1

Предпочтительно использовать существующий контейнер, как std::vector или std::list

#include <iostream> 
#include <string> 
#include <list> 

struct CamelZombie{ 
    std::string name; //added for demonstration purposes 
    int hp; 
    int attack; 
    //pointer to next zombie not required 
}; 

std::list<CamelZombie> createCamelZombie2(int z_hp, int z_attack, int N) { 

    std::list<CamelZombie> result; 

    for (int i = 0; i < N; i++){ 

    CamelZombie newZombie; 
    newZombie.name = "Zombie"+std::to_string(i); 
    newZombie.hp = z_hp; 
    newZombie.attack = z_attack; 
    newZombie.next = NULL; 

    result.push_back(newZombie); 
    } 

    return result; 
} 

Используйте код, как это.

int main() { 
    std::list<CamelZombie> listOfZombies2 = createCamelZombie2(10,20,10); 

    for(std::list<CamelZombie>::iterator list_iter = listOfZombies2.begin(); 
     list_iter != listOfZombies2.end(); list_iter++) 
    { 
    std::cout<<list_iter->name<<std::endl; 
    } 

} 

Если вы действительно хотите использовать свой собственный список, попробуйте код ниже.

  • Отдельная структура (list_of_cz) для списка не требуется. Каждый зомби ссылается на следующего зомби. Так что просто держите указатель на первого зомби.
  • функция createCamelZombie возвращает указатель на первый зомби в списке (нет необходимости использовать параметр функции (list_of_cz * & PZ), чтобы получить список зомби)
  • Слишком много подчеркиваний и Z делает код трудно читать.
  • Если вы используете указатели, вам нужно самостоятельно очистить память.

.

struct CamelZombie{ 
    std::string name; //added for demonstration purposes 
    int hp; 
    int attack; 
    CamelZombie *next; 
}; 

CamelZombie* createCamelZombie(int z_hp, int z_attack, int N){ 

    CamelZombie *result = NULL; 
    CamelZombie *work = NULL; //keep track of the last node in the list 

    for (int i = 0; i < N; i++){ 

    //create new zombie 
    CamelZombie *newZombie = new CamelZombie(); 
    newZombie->name = "Zombie"+std::to_string(i); 
    newZombie->hp = z_hp; 
    newZombie->attack = z_attack; 
    newZombie->next = NULL; 

    if (result==NULL) { 
     result = newZombie; 
     work =result; 
    } else { 
     work->next = newZombie; 
     work = newZombie; 
    } 
    } 

    return result; 
} 

Пример использования кода.

int main() { 

    CamelZombie *listOfZombies = createCamelZombie(10,20,10); 

    CamelZombie *work = listOfZombies; 

    // print zombie names to screen --------- 
    while (work!=NULL) { 
    std::cout << work->name << std::endl; 
    work = work->next; 
    } 

И свободная память.

work = listOfZombies; 
    while (work!=NULL) { 
    CamelZombie *temp =work->next; 
    delete work; 
    work = temp; 
    } 
Смежные вопросы