2

一段时间以来,我一直在尝试在 C 中创建一个链表,并且也设法做到了。现在我试图将我的全局指针/变量替换为本地指针/变量,以便在函数之间传递我的结构。问题是,我对这个主题阅读得越多,对它进行的实验越多,我收到的错误和爆炸就越多。

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

我已经宣布了一个结构:

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

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

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;

对我来说很明显,我没有以任何方式将我的结构从一个函数传递到另一个函数。我只是将全局 *global 分配给函数内的本地指针,它工作正常,但不是我想要学习的。

我一直在寻找我的问题的答案,但显然我在 C 的基础知识中遗漏了一些巨大的东西。

那么,我到底应该在这里做什么?我该如何移动

struct node *global;

在我的函数中,例如,我可以在我的主函数中创建一个链接列表,它将从中传递给函数添加、打印和退出。我如何从这些函数中返回这个列表?

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

4

3 回答 3

1

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

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

如何移动 struct node *global;

在我的函数中,例如,我可以在我的主函数中创建一个链接列表,它将从中传递给函数添加、打印和退出。我如何从这些函数中返回这个列表?

您必须使用两星指针,这是描述它的伪代码

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() 中的双星指针,从而消除了对全局指针的需要。

于 2013-03-03T13:20:11.143 回答
0

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

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

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

于 2013-03-03T13:13:56.607 回答
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);

}
于 2013-03-03T13:20:50.317 回答