我在网上看了很多不同的问题,无法弄清楚我做错了什么。我现在可能走向错误的方向,因为我尝试了很多不同的事情。
我只是想在C中创建一个简单的单链接列表。我似乎无法弄清楚如何使列表保持连接。
我的节点的结构
typedef struct node
{
double x; // x-coordinate of this point in the tour
double y; // y-coordinate of this point in the tour
struct node* next; // Pointer to the next node in the linked list
} Node;
这是我制作列表的代码,我在main
中构造一个空节点first = NULLNode* addFront(Node* first, double x, double y) {
first = malloc(sizeof(Node));
if (first == NULL) {
first->x = x;
first->y = y;
first->next = NULL;
}
else {
Node * temp = malloc(sizeof(Node));
temp->x = x;
temp->y = y;
temp->next = first;
first = temp;
}
//Temp testing
int size = 0;
Node * current = first;
while (current->next != NULL) {
printf("(%.4f, %.4f)\n", current->x, current->y);
current = current -> next;
size++;
}
printf("Size: %d\n", size);
return first;
}
一些注意事项:
检查first is是否为null应该是不必要的......应该只使用else语句构建列表。 (我的想法)
添加if / else语句后,我得到了一个似乎是无限循环的C,只是指向随机内存,最终导致分段错误。
我只是不知道还有什么要转向。非常感谢你的进步!
答案 0 :(得分:4)
这个块完全没有意义:
first = malloc(sizeof(Node));
if (first == NULL) {
first->x = x;
first->y = y;
first->next = NULL;
}
可能你想在块内移动first = malloc(sizeof(Node));
。它会工作,但它完全没必要,因为它在逻辑上等于else
块。所以你可以在那里留下第二块:
Node * temp = malloc(sizeof(Node));
temp->x = x;
temp->y = y;
temp->next = first;
first = temp;
return first;
// or rather return temp directly
还有一点 - 您应该在malloc
内存不足的情况下添加错误处理,因此您应检查temp == NULL
并采取相应措施(从函数返回NULL
或其他任何内容...)。
答案 1 :(得分:0)
对于初学者来说,即使是函数的第一个语句也是错误的,因为参数import subprocess
""" continuously print command output and append it to file while running """
def run(command):
popen = subprocess.Popen(command, stdout=subprocess.PIPE)
return iter(popen.stdout.readline, b"")
filename = "subprocess_output"
f = open(filename, "a")
for line in run(["/bin/bash", "infinite_loop.sh"]):
print(line), # the comma keeps python from adding an empty line
f.write(line)
f.close()
的值被覆盖了。
first
该功能可以按以下方式查看
Node* addFront(Node* first, double x, double y) {
first = malloc(sizeof(Node));
//...
或使用测试代码
Node * addFront( Node *first, double x, double y )
{
Node *temp = malloc( sizeof( Node ) );
if ( temp != NULL )
{
temp->x = x;
temp->y = y;
temp->next = first;
first = temp;
}
return first;
}