我一直试图做一个链表在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;
很明显,我没有以任何方式将我的结构从一个函数传递到另一个函数。我只是将全局*全局赋值给函数内部的局部指针,这工作得很好,但不是我想要学习的。
我一直在为我的问题寻找答案,但显然我在c的基础知识中遗漏了一些巨大的东西。
那么,我到底应该在这里做什么?如何移动
struct node *global;
例如,我可以在main函数中创建一个链表,从这个链表传递给add, print和quit函数。如何从这些函数中返回这个列表呢?另外,原来的结构应该是在代码的开始,还是我必须在每个函数内再次创建它,以避免全局指针/变量?
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()中的双星指针,从而消除了全局指针的需要。
基本思想是,将所有全局指针作为参数传递给函数。例如,add
变成
void add(node *ptr, node *last);
对所有函数都这样做,直到没有全局变量。
尝试为您的linkedlist定义另一个结构体:
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);
}