【问题标题】:C Linked lists with global variablesC 带全局变量的链表
【发布时间】:2013-10-01 14:00:00
【问题描述】:

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

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

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

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

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

然后我尝试通过分配另一个节点来添加其他节点,然后使用存储在我的 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;
}

【问题讨论】:

  • 为什么不用双指针而不是单指针?
  • newNode->pointer=ptr ; ptr 是什么?
  • @Tonmoy - 也许你错过了帖子的前 5 个字。为了您的利益,我会重复一遍。 “嗨,我是 C 新手”
  • struct node *root = malloc(sizeof(struct node)); 为什么要重复这行?你为每个新节点分配了内存吗?
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。我看着回答这个问题,但认为这会很困难,因为缺少必要的信息。请研究如何创建 SSCCE (Short, Self-Contained, Correct Example)。查看您正在使用的界面会有很大帮助。 C 不会强迫您使用全局变量。您可能会传入一个指向根节点的“指针”,或者每次调用函数时都可能返回新的根节点(两种技术都有效),但是由于我们看不到您的所有代码,所以很难知道。

标签: c pointers


【解决方案1】:

关于将参数更改为函数的一些说明。在 C 中,您只能通过函数调用上的指针传递,因此如果您想修改结构节点的值 - 您可以像函数中的 struct node * 一样传递它。同样,如果你想在函数中更改结构节点 * 的值(如分配或删除它),你可能希望像 struct node ** 一样传递它。

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

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

但您也可以将该根节点设为本地节点,也可以只是一个 struct node * 而不是 struct node **。然后简单地称它为:

addNode(&root, value);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2015-06-12
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多