通过指针传递

时间:2018-11-13 03:31:56

标签: c++ pointers linked-list

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

但是,当我离开函数然后调用print方法时,我得到了第一个值,然后没有任何值(空)。我猜想当我退出该功能时,它会带我回到原来的第一个([99])元素,现在实际上是最后一个元素。所以我的打印方法输出的元素看到null是下一个并结束。

或者我想我在函数中所做的更改即使在传递指针的情况下也仅在该函数的作用域内进行,但这没有任何意义,因为如果是这种情况,那么我应该仍然保留所有原始数据

def putCardMon():
    interfaceName = input(('Type an interface name to put in monitor mode: '))
    print(colored('[+] ', 'green') + 'Trying to put the interface ' + colored(interfaceName, 'yellow') + ' in monitor mode\n')
    call(["sudo ifconfig " + interfaceName + " down; sudo iwconfig " + interfaceName + " mode monitor; sudo ifconfig " + interfaceName + " up"], shell=True)
    interfaceMonCheck = Popen(["iwconfig " + interfaceName + " | grep Mode | cut -d ':' -f2 | cut -d ' ' -f1"], shell=True, stdout=PIPE, universal_newlines=True).communicate()[0].rstrip()
    sleep (1)
    return interfaceName

# Later you can do this
interfaceName = putCardMon()

感谢你们能给我的帮助,

谢谢!

3 个答案:

答案 0 :(得分:1)

更新: 通过将ListNode *list传递到reverseList,您将创建一个指针副本,该副本指向与nodes相同的地址。在函数内部,您将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;
}

尝试使用以下命令进行编译:-std = gnu ++ 11

答案 1 :(得分:0)

反向链接列表不是基本操作。它不属于您的类的基本操作。就您的其他操作而言,更容易(更安全)地实施它。大概是:

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

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

答案 2 :(得分:0)

您无需在nodes中更改reverseList,而只是更改list,而只是更改结构上的指针,该结构是一个临时对象,因此节点在物理上是相同的并指向相同的第一个元素,该元素现在具有指向next的{​​{1}}属性,因此Null的结果是正确的。您需要使用指针,例如

printList

此外,不要忘记删除动态创建的对象