我正在尝试编写代码来解决josephus问题,这是我目前正在阅读的书中的一个练习。
main.cc:
#include <iostream>
#include <cstdlib>
#include "node_ll.h"
int main(int argc, char *argv[])
{ int i, N = atoi(argv[1]), M = atoi(argv[2]);
Node<int> *t, *x;
Node<int>::construct(N);
for (i = 2, x = Node<int>::newNode(1); i <= N; i++)
{
t = Node<int>::newNode(i);
x->insert(t);
x = t;
}
while (x != x->next())
{
for (i = 1; i < M; i++) x = x->next();
x->remove()->deleteNode();
}
std::cout << x->item() << std::endl;
return 0;
}
node_ll.h:
#ifndef NODE
#define NODE
template <class T>
class Node
{
private:
static Node* freelist;
Node* link;
T data;
public:
static Node* newNode(T);
static void construct(int);
void deleteNode();
void insert(Node*);
Node* remove();
Node* next();
T item();
};
template <class T>
void Node<T>::insert(Node* t)
{
t->link = link;
link = t;
}
template <class T>
Node<T>* Node<T>::remove()
{
Node* t{link};
link = t->link;
return t;
}
template <class T>
Node<T>* Node<T>::next()
{
return link;
}
template <class T>
T Node<T>::item()
{
return data;
}
template <class T>
Node<T>* Node<T>::newNode(T x)
{
Node* t{freelist->remove()};
t->data = x;
t->link = t;
return t;
}
template <class T>
void Node<T>::construct(int N)
{
freelist = new Node[N+1];
for(int i{0}; i < N; i++)
freelist[i].link = &freelist[i+1];
freelist[N].link = 0;
}
template <class T>
void Node<T>::deleteNode()
{
freelist->insert(this);
}
#endif
在编译g ++时抛出以下错误:
/ usr / bin / ld:/tmp/ccNqFpW8.o:在函数Node<int>::construct(int)':
main.cc:(.text._ZN4NodeIiE9constructEi[_ZN4NodeIiE9constructEi]+0x31): undefined reference to
Node :: freelist'中
/ usr / bin / ld:main.cc:(.text._ZN4NodeIiE9constructEi[_ZN4NodeIiE9constructEi]+0x4e):对Node<int>::freelist'
/usr/bin/ld: main.cc:(.text._ZN4NodeIiE9constructEi[_ZN4NodeIiE9constructEi]+0x65): undefined reference to
Node :: freelist'的未定义引用
/ usr / bin / ld:main.cc:(.text._ZN4NodeIiE9constructEi[_ZN4NodeIiE9constructEi]+0x85):对Node<int>::freelist'
/usr/bin/ld: /tmp/ccNqFpW8.o: in function
Node :: newNode(int)'的未定义引用:
main.cc:(.text._ZN4NodeIiE7newNodeEi[_ZN4NodeIiE7newNodeEi]+0xe):未定义对Node<int>::freelist'
/usr/bin/ld: /tmp/ccNqFpW8.o:main.cc:(.text._ZN4NodeIiE10deleteNodeEv[_ZN4NodeIiE10deleteNodeEv]+0xf): more undefined references to
Node :: freelist'的引用
collect2:错误:ld返回1退出状态
我不知道发生了什么事
答案 0 :(得分:0)
您要声明一个类的成员为静态。这意味着对于您创建的类的每个实例,它们都将引用相同的静态值。因为只有一个值,所以需要在程序中的某个位置将其初始化一次。所以您缺少像这样的语句:
Node<int>::Node* freelist = foo; // The one-and-only 'foo' for all Node<int>s
让我指出,所有类都共享此变量的单个实例对我来说没有任何意义。此外,您的代码还包含此构造函数:
template <class T>
void Node<T>::construct(int N)
{
freelist = new Node[N+1];
如果您还尝试按实例进行初始化,则不会将该变量视为静态变量。
答案 1 :(得分:0)
我通过将自由列表声明为:
inline static Node* freelist;
代替:
static Node* freelist;
并将其编译为c ++ 17