我是链表的新手。我的练习有点像:;编写一个函数,将值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})
。