cmake_minimum_required( VERSION 3.8 )
set( CMAKE_C_FLAGS_DEBUG "" CACHE STRING "" )
set( CMAKE_CXX_FLAGS_DEBUG "" CACHE STRING "" )
set( CMAKE_C_FLAGS_RELEASE "" CACHE STRING "" )
set( CMAKE_CXX_FLAGS_RELEASE "" CACHE STRING "" )
project(hello)
set( SOURCE_FILES
hello.c foo.c )
add_executable( hello
${SOURCE_FILES} )
set_source_files_properties( foo.c
PROPERTIES
COMPILE_FLAGS "-O3 -DNDEBUG" )
set_source_files_properties( hello.c
PROPERTIES
COMPILE_FLAGS -O0 )
输出:
0 2 5 46 7 55
链接列表的开头是零的原因是什么? 我该如何解决?我不想打印零。
如果您在我的代码中发现了一些错误,请告诉我。我是编码新手。
答案 0 :(得分:1)
在main
中,您分配一个未初始化的Node
实例,并将指针存储在head
中。您永远不会分配该节点的head->data
,因此该值是不确定的。同样适用于head->next
。在add
和display
中读取这些值时,程序的行为是未定义的。
我该如何解决?
首先,在head
中初始化main
以避免未定义的行为:
Node *head = new Node();
// ^^ these are important
然后你可以做其中一件事:
a)使用display(head->next);
而不是display(head);
b)将head
初始化为您想要的第一个值
head->data = ar[0];
for(int i=1; i<5;i++)
// ...
c)重新设计API,不要求用户单独分配第一个节点。在雷米的回答中有关于此的更多细节。
答案 1 :(得分:0)
您的代码存在一些问题:
分配head
节点时,您没有为其data
成员分配任何值,因此它保存发生的随机值为0在你的情况下。您也没有初始化其next
成员,这意味着add()
和display()
将无法正常运作。
add()
中,如果head
为空,则不会向列表中添加任何节点(您不必将调用者的Node*
变量更新为指向新节点),并泄漏分配的newNode
。
退出main()
时,您正在泄漏所有已分配的节点。
请改为尝试:
#include <iostream>
struct Node {
int data;
Node* next;
Node(int value) : data(value), next(0) {}
};
void add(Node* &head, int n) {
Node **newNode = &head;
while (*newNode) {
newNode = &((*newNode)->next);
}
*newNode = new Node(n);
}
void display(Node *head) {
Node *cur = head;
while (cur) {
std::cout << cur->data << " ";
cur = cur->next;
}
std::cout << std::endl;
std::cout << std::endl;
}
void clear(Node* &head) {
Node *cur = head;
head = NULL;
while (cur) {
Node *next = cur->next;
delete cur;
cur = next;
}
}
int main()
{
Node *head = NULL;
int ar[] = {2, 5, 46, 7, 55};
for(int i = 0; i < 5; ++i){
add(head, ar[i]);
}
display(head);
clear(head);
return 0;
}
然后,当你开始工作时,把它扔掉,然后使用STL的std::list
容器代替:
#include <iostream>
#include <list>
void display(const std::list<int> &mylist) {
for(std::list<int>::const_iterator iter = mylist.begin(); iter != mylist.end(); ++iter) {
std::cout << *iter << " ";
}
std::cout << std::endl;
std::cout << std::endl;
}
int main()
{
std::list<int> mylist;
int ar[] = {2, 5, 46, 7, 55};
for(int i = 0; i < 5; ++i){
mylist.push_back(ar[i]);
}
/* or:
int ar[] = {2, 5, 46, 7, 55};
std::list<int> mylist(ar, ar+5);
*/
display(mylist);
return 0;
}