C++ 列表函数不旋转

C++ list functions not worling

提问人:Zenidal 提问时间:4/20/2022 最后编辑:Vlad from MoscowZenidal 更新时间:4/21/2022 访问量:46

问:

我正在尝试创建一个程序,让我在列表的尾部添加元素,然后打印它们。它没有给我一个错误,但他什么也没做。我做错了什么?

#include<iostream>
using namespace std;
 
struct lista{
    int val;
    lista *next;
};

typedef lista* ptr_lista;

void tail_add(ptr_lista head, int valore){
    if(head=NULL){
         head=new lista;
         head->val=valore;
         head->next=NULL;
    } else {
        ptr_lista p=head;
        while(p->next!=NULL){
                p=p->next;
        }
        p->next=new lista;
        p->next->val=valore;
        p->next->next=NULL;
    }
}

void print(ptr_lista p){
     while(p!=NULL){
            cout<<p->val<< " ";
            p=p->next;
      }
}

int main(){
    ptr_lista m;
    tail_add(m,5);
    tail_add(m,6);
    print(m);
}
C++ 结构 Pass-by-Reference 单链接列表 Pass-By-value

评论


答:

1赞 Vlad from Moscow 4/20/2022 #1

对于初学者,指针未初始化,并且具有不确定的值m

ptr_lista m;

您需要初始化它

ptr_lista m = nullptr;

该函数按值接受指针

void tail_add(ptr_lista head, int valore){

因此,更改函数中的参数,例如head

 head=new lista;

对 main 中声明的原始指针没有影响。m

您需要将参数声明为对指针的引用

void tail_add(ptr_lista &head, int valore){

该函数可以按以下方式定义

void tail_add( ptr_lista &head, int valore )
{
    ptr_lista new_lista_ptr = new lista { valore, nullptr };

    if ( head == nullptr )
    {
         head = new_lista_ptr;
    } 
    else 
    {
        ptr_lista p = head;

        while ( p->next ) p = p->next;

        p->next = new_lista_ptr;
    }
}

请注意,为指针引入别名不是一个好主意,例如

typedef lista* ptr_lista;

例如,如果你将

const ptr_lista

那么它的意思是

lista * const

const lista *

这是函数参数声明所必需的,因为它不会更改列表的节点。print