将新节点添加到C中的链表的过程



我知道程序是如何工作的,但我无法理解这个概念。下面是主要函数:

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),并在那里插入新创建的节点

相关内容

  • 没有找到相关文章

最新更新