没有全局变量的链表

时间:2013-03-03 13:04:59

标签: c linked-list

我一直在尝试在C中做一个链表,但也成功了。现在我试图将我的全局指针/变量替换为本地指针/变量,以便在函数之间传递我的结构。问题是我对这个主题的阅读越多,我对它的实验就越多,我心中的错误和爆炸就越多。

由于我的代码有点长(100行),我会尝试解释它在做什么以及如何做。

我已经宣布了一个结构:

struct node {
    char Name[21];
    struct node *Next;
};

我还在任何函数之前宣布了一个指向我的struct的指针:

struct node *global;

* global是一个全局指针不是吗?

现在我有三个函数,里面有新的指针来处理我的链表:

void add(void); //add nodes to list with *global, *pointer and *last
    struct node *pointer *last;
void print(void); //print node inside the list with *global and *pointer
    struct node *pointer;
void quit(void); //free malloc'd list using *global and *pointer
    struct node *pointer;

对我来说很明显,我没有以任何方式将我的结构从一个函数传递给另一个函数。我只是将全局*全局赋值给函数内部的本地指针,这很好,但不是我想要学习的东西。

我一直在寻找我的问题的答案,但显然我遗漏了C的基本知识。

那么,我到底应该做什么呢?我怎么能移动

struct node *global;

在我的函数中,以便我可以在我的main函数中创建一个链表,然后将其传递给函数add,print和quit。如何从这些功能返回此列表?

此外,原始结构是应该在代码的开头还是我必须在每个函数内再次创建它以避免全局指针/变量?

3 个答案:

答案 0 :(得分:1)

  

struct node * global是一个全局指针不是吗?

是的,指针在整个程序中都可用。

  

我该怎么办?       struct node * global;

     

在我的函数中,以便我可以在我的main函数中创建一个链表,然后将其传递给函数add,print和quit。如何从这些函数中返回此列表?

你必须使用一个双星指针,这是一个描述它的伪代码

struct listNode {                                      
   char data;
   struct listNode *nextPtr; // pointer to next node
};


void insert(**localptr,char item);
void remove(**localptr,char item);


int main()
{
 listnode * startptr;
 ..
 insert(&startptr,'a');
 ..
 ..
 remove(&startptr,'b');
 ..

}

在执行insert()/ remove()时,必须先获取起始地址并在列表中导航,然后在查找节点后备份下一个和上一个指针,添加或删除节点,以及然后恢复上一个和下一个指针,

在上面的代码中这里在main()中本地创建了一个起始指针,地址被传递给insert()/ remove()中的双星指针,从而消除了对全局指针的需要。

答案 1 :(得分:0)

基本思想是,将所有全局指针作为参数传递给函数。例如,add变为

void add(node *ptr, node *last);

对所有函数执行此操作,直到没有全局变量为止。

答案 2 :(得分:0)

尝试为您的链表定义另一个结构,如下所示:

struct node
{
     type value;
     node * next;
}
struct linkedList
{
    node * first;
}

void add(linkedlist a,type data){
 node * newNode ;
 newNode->value = data;
 newNode->next = a->first;
 a->first = newNode;
}

依旧......

然后使用链接列表

  void main()
 {
    linkedlist a;
    type x= somevalue;
    add(a,somevalue);

}