如何获取链表中的所有"next"节点?构建调用字符串不起作用



,所以我有问题。我的目标是通过我创建的Sigly链接列表进行迭代。我想将std ::字符串用作参数,以if语句类似以下列出。我知道这不是一个好主意,甚至更多:我知道这可能是最糟糕的方法。我想知道是否可以完成并不重要。我尝试使用宏功能,但是我做错了,或者使用这种宏不可能。请帮帮我。我没有想法...

我在旧项目中使用的类似宏,我从cmath lib中传递了一个函数名称(用户键入诸如sin'或'tan'之类的诸如'sin'或'tan'的名称),以计算给定功能的积分,因此我认为在这种情况下它也可以工作,但显然不起作用。它说:

类型'std :: string'的条件表达是非法的

//structures.h    
struct node
{
    int _value;
    node *pNext;
};

//functions.cpp
#define retarded_at(x) x
#define retarded_stringify(y) retarded_at(y)
//@param pHead pointer to first element of the list
void retDispIter(node *pHead)
{
    std::string at{ "pHead->pNext" };
    while (retarded_at(at))
    {
        at += "->pNext";
        //here send node->_value to std::cout
    }
}

在下一个元素上,循环" at"的循环" at"将是'phead-> pnext'的pnext'。列表中的8个元素的最后时间就像:

while(pHead->pNext->pNext->pNext->pNext->pNext->pNext->pNext->pNext)

返回false和" at"将包含'指针'(nullptr)到不存在的第9个元素。

您不想以您要求的方式达到什么:

  • C 无法在运行时创建的"文本",所有代码都必须在编译时可用,因此可以将其编译到目标计算机 - 机器代码,
  • 在运行时,机器代码未使用符号(变量,类,函数的名称)(符号转换为地址和寄存器以及地址偏移)

使此工作的最简单方法是:

//@param pHead pointer to first element of the list
void retDispIter(node *pHead)
{
    node* current_node = pHead;
    while (current_node)
    {
        //here send current_node->_value to std::cout
        current_node = current_node->pNext;
    }
}

另一种方法是使一个非常简单的迭代类;

struct node_iterator
{
    node* current;
    node_iterator operator++()
    {
        node* temp = current;
        current    = current->pNext;
        return node_iterator { temp };
    }
    node_iterator& operator++(int)
    {
        current = current->pNext;
        return *this;
    }
    node*    operator->() const { return current; }
    node&    operator*() const { return *current; }
    explicit operator bool() const { return current != nullptr; }
    bool     operator==(const node_iterator& other) const { return current == other.current; }
    bool     operator!=(const node_iterator& other) const { return !(*this == other); }
};

然后可以像这样使用:

//@param pHead pointer to first element of the list
void retDispIter(node* pHead)
{
    node_iterator iter { pHead };
    while (iter)
    {
        // usage
        std::cout << iter->_value;
        std::cout << (*iter)._value;
        // get next 
        ++iter;
    }
}

c 不像matlab或python。它不会在运行时编译字符串或代码行。所以不,您不能以这种方式使用字符串。

通过谷歌搜索"编译器与解释器"来查看差异。C 是基于编译器的,而Python是基于解释器的。C 生成程序的用户不需要拥有所有构建工具来运行它们。

相关内容

最新更新