在链表运行时错误中插入节点

时间:2017-10-09 04:51:32

标签: c++ algorithm linked-list

在给定城市名称和头部指针的情况下,代码应该在前一个节点参数之后添加一个节点。我得到一个运行时错误,但是,当我运行代码时,为什么?

 city* addCity(city *head, city *previous, string cityName )
    {
        city* add = new city;
        add->name=cityName;
        add->next = NULL;
        city* tmp = new city;
        tmp = head;


        if(tmp==NULL){
            tmp = add;
        }

        while(tmp != NULL && tmp != previous){
            tmp = head;
            tmp = tmp->next;
        }


    if(tmp == previous){
        add->next = previous->next;
        tmp->next = add;
        head = tmp;
        return head;
        } 


        }

4 个答案:

答案 0 :(得分:1)

  while(tmp != NULL && tmp != previous){
        tmp = head;
        tmp = tmp->next;
  }

在每次迭代中tmp重置为head时,这将无限次运行。 tmp只是在此循环中以值headhead->next之间的循环方式切换。

答案 1 :(得分:0)

  

如果您的上一个节点包含下一个节点和String,您可以直接将新节点添加到该节点。

试试这个

city* addCity(city *head, city *previous, string cityName ){
    city* add = new city;
    add->name=cityName;
    if (head == NULL || previous == NULL){
        add->next = head ;
        return add;
    }
    add->next = previous->next;
    previous->next = add;
    return head;
}

这也足以达到同样的目的。

对于要创建的第一个节点,请检查以下示例

void Cites(){
    city *head = new city();
    head = addCity(head, head ,"First city name");
    //Do the rest of the codes
}

已编辑:现在,此代码甚至可以在第一个代码中添加节点。将前一个传递为NULL

答案 2 :(得分:0)

您的代码存在很多问题。

<强>首先,

tmp

您正在为head创建一个新城市,但会立即将其分配给*tmp。假设您只需city *tmp = new city;,那么您可以将city *tmp = head;更改为if(tmp==NULL){ tmp = add; }

,然后,

tmp == NULL

head表示该列表为空。因此,您应该将新城市添加到if(tmp==NULL){ head = add; return head; } ,然后从那里返回。 所以,你的代码应该是 -

while(tmp != NULL && tmp != previous){
    tmp = head;
    tmp = tmp->next;
}

<强>继续,

tmp

如果NULL不是tmp = head; while(tmp != NULL || tmp != previous){ tmp = tmp->next; } ,则这是一个无限循环。因为你在每次迭代中都做同样的事情。它应该像 -

if(tmp == previous){
    add->next = previous->next;
    tmp->next = add;
    head = tmp;
    return head;
}

<强>转发,

tmp

我不知道你为什么要将head分配给head = tmp;。只需删除RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list RUN apt-get update && apt-get install -y python-software-properties software-properties-common postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 USER postgres RUN /etc/init.d/postgresql start &&\ psql --command "CREATE USER postgres1 WITH SUPERUSER PASSWORD 'password';" &&\ createdb -O postgres1 password RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf EXPOSE 5432 VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"] 就可以解决很多问题。

答案 3 :(得分:0)

太复杂。

您有两种常见情况:要么您已获得列表中的previous节点,那么您不必寻找,或{{1然后在列表的前面插入新节点(这也包括空列表的情况)。

previous == NULL

请注意city* addCity(city *head, city *previous, string cityName) { city *newcity = new city; newcity->name = cityName; if (previous != NULL) { newcity->next = previous->next; previous->next = newcity; } else { newcity->next = head; head = newcity; } return head; } 语句 - 您的函数无权访问列表的原始return,因此通知外部代码的唯一方法是在列表的前面出现一个新节点返回指向它的指针。当然,如果在列表中的某处插入新节点或在末尾附加新节点,则磁头不会更改,返回的值等于输入head