我知道程序是如何工作的,但我无法理解这个概念。下面是主要函数:
void main() {
lista node1, p, q;
int n, i;
int a;
node1 = NULL;
printf("data = ");
scanf("%d", &a);
while (!feof(stdin)) {
if (add_to_list(&node1, a)!=0) {
printf("nod (CTRL-z) = ");
scanf("%d", &a);
}
else printf("can't insert");
}
add_to_list函数
int add_to_list(lista *head, int info) {
lista p, nou;
int cod;
if (nou = (lista)malloc(sizeof(nod))) {
if (*head == NULL) {
nou->data = info;
nou->leg = NULL;
*head = nou; //la adresa listei noastre in primul element se baga noul element creat aici
}
else {
p = *head;
while (p->leg != NULL) {
p = p->leg;
}
nou->data = info;
nou->leg = NULL;
p->leg = nou;
}
cod = 1;
}
else {
cod = 0;
}
return cod;
}
这是我使用的数据结构
typedef struct nod {
int data;
struct nod *leg;
} *lista;
所以问题是,尽管我完全理解整个程序中发生的事情,但我无法理解节点是如何不断添加的。
如果您查看main()函数,我将node1设置为NULL,那么我将获得每个'节点'的.data(保存在int a中)。调用add_to_list函数传递node1的地址和数字,对吧?在函数中,它分配空间,因为它是null,将变量a的值放在.data字段中,然后将null赋值给该节点的指针(它假设它可能是最后一个,所以这是正确的做法)。直到现在清除
现在返回'cod 1'到main函数(),这意味着我可以从键盘上进一步输入数字。问题是,假设我输入数字'3',再次调用函数add_to_list传递null node1和'3' (var a)。在此之后,我没有得到它。
我的想法是node1不再是空的,因为它是作为"引用"传递的,它包含了第一个节点的地址。因此,在add_to_list()中,它应该直接跳转到else部分,尝试找到指向null(最后一个)的节点,并从那里创建一个新节点并将其连接到最后一个。我说的对吗?还是我错过了什么?
谢谢。
是的,您是对的:else
部分适用于除第一个节点之外的每个节点。当第一个节点被添加到[empty]列表中时,node1
参数只被修改一次。
第一次调用add_to_list()时头部为NULL,因此头部被分配给具有正确数据的新节点。在此之后,它不是NULL,因此它将执行else部分,该部分将转到列表的最末尾,然后将新创建的节点放在末尾。如果返回0,则malloc有问题,数据没有被插入。除此之外都很好。fof()将返回0,只要你没有击中stdin的"end",这允许你继续插入数据。
创建节点的函数将仅在malloc失败时返回NULL,或者如果整个列表为NULL。在create node函数中,您将遍历整个列表以找到结束节点(该节点将指向NULL),并在那里插入新创建的节点