C带有全局变量的链接列表

时间:2013-10-01 14:00:00

标签: c pointers

嗨,我是C的新手,我正在努力让链表工作,我不得不使用全局变量,因为我无法更改被调用函数的参数。我声明了struct和两个全局指针来跟踪根地址和最后一个地址。

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; 

然后我尝试通过mallocing另一个节点添加aditional节点,然后使用存储在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;
}

1 个答案:

答案 0 :(得分:0)

关于将参数更改为函数有一点说明。在C中,你只能通过函数调用的指针传递,所以如果你想修改struct节点的值 - 你就像在函数中传递struct node *一样。类似地,如果你想在函数中更改struct node *的值(如分配它或删除它),你可能想要像struct node **一样传递它。

你的函数原型可能看起来像这样:

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

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

addNode(&root, value);