gpt4 book ai didi

C 带全局变量的链表

转载 作者:太空宇宙 更新时间:2023-11-04 04:47:48 25 4
gpt4 key购买 nike

您好,我是 C 的新手,我正在努力使链表正常工作,我不得不使用全局变量,因为我无法更改正在调用的函数的参数。我声明结构和两个全局指针来跟踪根地址和最后一个地址,就像这样。

struct node {
char* pointer;
struct node *next;
};

struct node** rootNode;
struct node** lastNode;

然后在函数内部,我分配了一个新结构并尝试设置列表中的第一个节点。为了尝试保存该节点的位置,我想我正在将全局指针 lastNode 分配给根指针。

struct node *root = malloc(sizeof(struct node));
...
root->pointer=ptr;
root->next = 0;
rootNode = &root;
lastNode = &root;

然后我尝试通过 malloc 另一个节点添加其他节点,然后使用存储在我的 lastNode 指针中的地址链接前一个节点。

struct node *newNode = malloc(sizeof(struct node));

newNode->pointer=ptr ;
(*lastNode)->next = newNode;
newNode->next = 0;
lastNode = &newNode;

然而,这似乎并没有真正奏效。当我运行以下程序时,程序匹配列表中的前两项,但随后为所有节点返回 null。我已经坚持了 2 天了,非常感谢任何帮助:)

struct node* test;
test = (*rootNode);
enter code here
while (test) {
if (test->pointer == ptr) {
printf("MATCH!!");
notFound = 0;
break;
}
else {
test = test->next;
}
}

编辑 一些人要求我提供更多代码。这是我想在其中创建链表的函数。它在我的程序运行时被多次调用,每次调用时我都试图将一个新节点添加到我的链表中。我还在顶部包含了全局变量。

struct node** rootNode;
struct node** lastNode;
int firstRun = 1;

struct node {
char* pointer;
struct node *next;
};

void malloc(size_t sz) {

size_t maxSize = (size_t)-1;
char * payloadPtr = NULL;

if (sz > maxSize - sizeof(struct node)+sizeof(int)) {
return ptr;
}

if (firstRun) {

struct node *root = malloc(sizeof(struct node));

ptr = malloc(sizeof(size_t)+sz);

if (ptr == NULL) {
return ptr;
}
memcpy(ptr, &sz, sizeof(int));
payloadPtr = ptr+1;
root->pointer=payloadPtr;
root->next = 0;
rootNode = &root;
lastNode = &root;
firstRun = 0;

}
else {
struct node *newNode = malloc(sizeof(struct node));
ptr = malloc(sizeof(size_t)+sz);

if (ptr == NULL) {
return ptr;
}
memcpy(ptr, &sz, sizeof(int));
payloadPtr =ptr+1;
newNode->pointer= payloadPtr;
(*lastNode)->next = newNode;
newNode->next = 0;
lastNode = &newNode;
}

return payloadPtr;
}

最佳答案

关于将参数更改为函数有一些说明。在 C 语言中,你只能在函数调用中传递指针,所以如果你想修改一个结构节点的值——你可以像函数中的 struct node * 一样传递它。类似地,如果您想在函数中更改 struct node * 的值(如分配或删除它),您可能希望像 struct node ** 一样传递它。

您的函数原型(prototype)可能必须如下所示:


void addNode(struct node** root, char* value)

但是您也可以使该根节点成为本地节点,并且也只是一个结构节点 * 而不是结构节点 **。然后简单地称它为:


添加节点(&根,值);

关于C 带全局变量的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19118211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com