主要实现了链表



我是链表的新手。我的练习有点像:;编写一个函数,将值x放在链表的末尾;。因此,我的代码将如下所示:(p是指向第一个值的指针(

struct node
{
int info;
node *next;
};
void LastElement(int x , node * & p)
{
node *q = new node;
q = p;
while (q -> next != NULL)
q = q -> next;

q->next->info = x;
q->next->next = NULL;
}

我的问题是:如何验证这个程序?我在主函数中写什么?我会创建一个数组还是。。。?

要简单地测试代码,可以执行以下函数:

void check(node *p) {
while (p != nullptr) {
std::cout << p->info << std::endl;
}
}

但是这个函数不适用于你的实际代码,因为当你这样做时:

q->next->info = x;
q->next->next = NULL;

您的程序将崩溃,因为此时q->next为空。如果您不想添加一个值为x的新节点,请创建一个新节点,并将其放入以下位置:

// generate the need node
node *new_node = new node;
new_node->info = x;
// push the new node to the linked list
node->next = new_node;

但如果你不想修改最后一个节点做:

node->info = x;
// but not like you did:
// node->next->info = x;

您应该编写一个测试函数来验证链表的形状是否正确。例如,该测试函数可以与std::vector并行遍历链表,并测试元素是否成对相同,长度是否相同。它的原型将类似于bool testEqual(node * list, std::vector<int>)

现在只需调用LastElement几次,然后检查生成的链表的形状是否正确。

这里有一个参考实现,如果你愿意,你可以将其调整为阵列:

bool testEqual(node * list, const std::vector<int>& test) {
for (int i = 0; i < test.size() && list != nullptr; i++)
if (test[i] != list->info) {
std::cerr << "mismatch at index " << i << std::endl;
return false;
}
list = list->next;
}
if (i == test.size() && list == nullptr) {
return true;
} else {
std::cerr << "list is too " << (list == nullptr ? "short" : "long" ) << std::endl;
return false;
}
}

只需将其称为testEqual(theList, {1,2,3,4,5})

相关内容

  • 没有找到相关文章

最新更新