Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针传递问题_C++_Pointers_Linked List - Fatal编程技术网

C++ 指针传递问题

C++ 指针传递问题,c++,pointers,linked-list,C++,Pointers,Linked List,我正在尝试实现自己版本的链表以供学习。我有以下代码。reverseList函数工作正常,如果我在该函数中打印它,则效果良好 但是,当我离开函数,然后调用print方法时,我得到第一个值,然后是nothing(null)。我猜当我离开函数时,它会把我带回到最初的第一个([99])元素,它现在实际上是最后一个元素。因此,我的print方法输出元素sees null作为下一个元素并结束 或者我认为我在函数中所做的更改只是在该函数的作用域内,即使我传递了一个指针,但这没有意义,因为如果是这样的话,那么我

我正在尝试实现自己版本的链表以供学习。我有以下代码。reverseList函数工作正常,如果我在该函数中打印它,则效果良好

但是,当我离开函数,然后调用print方法时,我得到第一个值,然后是nothing(null)。我猜当我离开函数时,它会把我带回到最初的第一个([99])元素,它现在实际上是最后一个元素。因此,我的print方法输出元素sees null作为下一个元素并结束

或者我认为我在函数中所做的更改只是在该函数的作用域内,即使我传递了一个指针,但这没有意义,因为如果是这样的话,那么我应该保留所有原始数据

struct ListNode
{
    int value;
    ListNode* next = NULL;
};

void insertRecList(ListNode* list, int value)
{
    if(list->next == NULL)
    {
        ListNode* end = new ListNode;
        end->value = value;
        list->next = end;
    }
    else
        insertRecList(list->next, value);
}

void printList(ListNode* list)
{
    std::cout << list->value << std::endl;
    while(list->next != NULL)
    {
        list = list->next;
        std::cout << list->value << std::endl;
    }
}

void reverseList(ListNode* list)
{
    ListNode* next;
    ListNode* prev  = NULL;
    ListNode* cur   = list;

    while(cur != NULL)
    {
        if(cur->next == NULL)
        {     
            cur->next = prev;
            break;
        }
        else
        {
            next = cur->next;
            cur->next = prev;
            prev = cur;
            cur = next;
        }
    }
    list = cur;
    std::cout << cur->value << " list:" <<  list->value << std::endl;

}

void testLinkedList()
{
    srand(time(NULL));

    ListNode nodes;
    nodes.value = 99;
    int val;

    for(int i = 0; i < 5; i++)
    {
        val = rand() % 30 + 1;
        insertRecList(&nodes, i);
        //insertList(&nodes, val);
    }
    printList(&nodes);
    reverseList(&nodes);
    printList(&nodes);
}

int main()
{
    testLinkedList();
    return 0;
}
struct ListNode
{
int值;
ListNode*next=NULL;
};
void insertRecList(列表节点*列表,int值)
{
如果(列表->下一步==NULL)
{
ListNode*end=新的ListNode;
结束->值=值;
列表->下一步=结束;
}
其他的
insertRecList(列表->下一步,值);
}
作废打印列表(列表节点*列表)
{
std::cout value next!=NULL)
{
列表=列表->下一步;
std::cout value next==NULL)
{     
cur->next=prev;
打破
}
其他的
{
下一步=当前->下一步;
cur->next=prev;
prev=cur;
cur=下一个;
}
}
列表=cur;
标准::cout值更新:
通过将
ListNode*list
传递给
reverseList
,您可以创建指向与
节点
相同地址的指针副本。在函数内部,您可以将
list
分配给更新后的
cur
指针,但副本将在最后销毁。
list
仍然指向与之相同的地址在传递到
reverseList
之前,但其
next
已更改

我对您的代码做了一些修改:

#include <cstdlib>
#include <iostream>

struct ListNode
{
    int value;
    ListNode* next = nullptr;
};

void insertRecList(ListNode* list, int value)
{
    if(list->next == nullptr)
    {
        ListNode* end = new ListNode;
        end->value = value;
        list->next = end;
    }
    else
        insertRecList(list->next, value);
}

void printList(ListNode* list)
{
    std::cout << list->value << std::endl;
    while(list->next != nullptr)
    {
        list = list->next;
        std::cout << list->value << std::endl;
    }
}

void reverseList(ListNode** list)
{
    ListNode* cur   = *list;
    ListNode* next  = cur->next;
    ListNode* prev  = nullptr;

    while(cur != nullptr)
    {
        next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    *list = prev;
}

void cleanNodes(ListNode *list) {
    // clean goes here
}

void testLinkedList()
{
    srand(time(nullptr));

    ListNode *nodes = new ListNode();
    nodes->value = 99;
    int val;

    for(int i = 0; i < 5; i++)
    {
        val = rand() % 30 + 1;
        insertRecList(nodes, i);
        //insertList(&nodes, val);
    }
    printList(nodes);
    reverseList(&nodes);
    printList(nodes);

    cleanNodes(nodes);
}

int main()
{
    testLinkedList();
    return 0;
}
#包括
#包括
结构列表节点
{
int值;
ListNode*next=nullptr;
};
void insertRecList(列表节点*列表,int值)
{
如果(列表->下一步==nullptr)
{
ListNode*end=新的ListNode;
结束->值=值;
列表->下一步=结束;
}
其他的
insertRecList(列表->下一步,值);
}
作废打印列表(列表节点*列表)
{
std::cout value next!=nullptr)
{
列表=列表->下一步;
std::下一个cout值;
ListNode*prev=nullptr;
while(cur!=nullptr)
{
下一步=当前->下一步;
cur->next=prev;
prev=cur;
cur=下一个;
}
*列表=上一个;
}
void cleanNodes(列表节点*列表){
//这里是干净的
}
void testLinkedList()
{
srand(时间(nullptr));
ListNode*节点=新建ListNode();
节点->值=99;
int-val;
对于(int i=0;i<5;i++)
{
val=rand()%30+1;
insertRecList(节点,i);
//插入列表(&节点,val);
}
打印列表(节点);
反向列表(&节点);
打印列表(节点);
清洁节点(节点);
}
int main()
{
testLinkedList();
返回0;
}

尝试使用:-std=gnu++11编译,反转链表不是一个基本操作。它不属于类的基本操作。在其他操作中实现它更容易(更安全)。大致如下:

  • 创建一个空列表
  • 当第一个列表不为空时,从第一个列表的前面删除一个节点,然后将其插入第二个列表的前面

第二个列表现在与原始列表相反。

reverseList
中,您没有更改
节点
,您只是更改
列表
您的结构上的一个指针,它是一个临时对象,因此节点在物理上是相同的,并指向现在具有
next
attrib的相同的第一个元素ute指向
Null
,因此
printList
的结果是正确的

#include <iostream>
#include <cstdlib>


struct ListNode
{
    int value;
    ListNode* next = NULL;
    ~ListNode(){
        if(this->next)
            delete this->next;
    }
};

void insertRecList(ListNode* list, int value)
{
    if(list->next == NULL)
    {
        ListNode* end = new ListNode;
        end->value = value;
        list->next = end;
    }
    else
        insertRecList(list->next, value);
}

void printList(ListNode* list)
{
    std::cout << list->value << std::endl;
    while(list->next != NULL)
    {
        list = list->next;
        std::cout << list->value << std::endl;
    }
}

ListNode * reverseList(ListNode* list)
{
    ListNode* next;
    ListNode* prev  = NULL;
    ListNode* cur   = list;

    while(cur != NULL)
    {
        if(cur->next == NULL)
        {
            cur->next = prev;
            break;
        }
        else
        {
            next = cur->next;
            cur->next = prev;
            prev = cur;
            cur = next;
        }
    }
    std::cout << cur->value << " list:" <<  list->value << std::endl;
    return cur;
}

void testLinkedList()
{
    srand(time(NULL));

    ListNode * nodes = new ListNode;
    nodes->value = 99;
    int val;

    for(int i = 0; i < 5; i++)
    {
        val = rand() % 30 + 1;
        insertRecList(nodes, i);
        //insertList(&nodes, val);
    }
    printList(nodes);
    nodes = reverseList(nodes);
    printList(nodes);
    delete nodes;
}

int main()
{
    testLinkedList();
    return 0;
}
#包括
#包括
结构列表节点
{
int值;
ListNode*next=NULL;
~ListNode(){
如果(本->下一步)
删除此->下一步;
}
};
void insertRecList(列表节点*列表,int值)
{
如果(列表->下一步==NULL)
{
ListNode*end=新的ListNode;
结束->值=值;
列表->下一步=结束;
}
其他的
insertRecList(列表->下一步,值);
}
作废打印列表(列表节点*列表)
{
std::cout value next!=NULL)
{
列表=列表->下一步;
std::cout value next==NULL)
{
cur->next=prev;
打破
}
其他的
{
下一步=当前->下一步;
cur->next=prev;
prev=cur;
cur=下一个;
}
}

std::cout value在
insertRecList
中的
prev
指针在哪里寻址?我没有,prev指针仅用于反转。这是一个单链接列表,而不是双链接列表。建议:在必须使用随机数进行测试之前,不使用随机数进行测试。一致性是调试的关键之一。您点击sam反复重复,直到你发现模式并修复它。随机数使发现模式变得越来越困难。@CodySavage-gotcha,刚刚看到插入和
prev
,有点困惑…我道歉,但我不明白,也许我误解了,但你是说我的循环提前终止了吗?如果是,我不这么认为,我可以打印该函数中的列表,它是正确的。我正在设置下一个节点,然后再更改cur节点,这样它将继续正常运行。即:在每次迭代开始时,下一个节点是实际的下一个节点,而不是上一个。就是这样,我非常感谢您的帮助。