在给定城市名称和头部指针的情况下,代码应该在前一个节点参数之后添加一个节点。我得到一个运行时错误,但是,当我运行代码时,为什么?
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;
}
}
答案 0 :(得分:1)
while(tmp != NULL && tmp != previous){
tmp = head;
tmp = tmp->next;
}
在每次迭代中tmp
重置为head
时,这将无限次运行。 tmp
只是在此循环中以值head
和head->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
。