【问题标题】:How to create a linked list in C++?如何在 C++ 中创建链表?
【发布时间】:2016-09-10 14:46:28
【问题描述】:

我得到了这两个结构

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;
    }
}

然后我像这样把它放在函数 main 中,但是 proram 崩溃了,不知道为什么。

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-&gt;hp 没有值。请帮帮我!

【问题讨论】:

  • 请逐字发布错误信息!
  • + pZ->head 0xcdcdcdcd {hp=???攻击=???下一个=??? } CamelZombie * 编译器告诉我这个
  • 这属于你的问题。 (就像你目前没有提供的 minimal, complete, and verifiable example 一样。关于那个看似奇怪的值,you may find this helpful
  • 您正在访问一个未初始化的指针。请注意,这是运行时错误消息,而不是编译器问题。
  • "如何在 C++ 中创建链表?" - 使用std::list

标签: c++ data-structures singly-linked-list


【解决方案1】:

最好使用现有的容器,例如 std::vectorstd::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;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多