0

我知道该程序是如何工作的,但我无法理解这个概念。这是主要功能:

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 的地址和数字,对吗?在函数中,它分配空间,因为它为空,将变量 a 的值放在 .data 字段中,然后将 NULL 分配给该节点的指针(假设它可能是最后一个,所以这是正确的做法)。清清楚楚到现在。

现在将“cod 1”返回到主函数(),这意味着我可以从键盘上进一步输入数字。问题是,假设我输入了数字“3”,再次调用函数 add_to_list 传递一个空 node1 和“3”(var a)。在这之后我不明白。

我的想法是 node1 不再为空,因为它是作为“引用”传递的,并且它包含第一个节点的地址。所以在 add_to_list() 中它应该直接跳转到 else 部分,尝试找到一个指向 null 的节点(最后一个),然后从那里创建一个新节点并将其连接到最后一个节点。我对吗?还是我错过了什么?

谢谢你。

4

3 回答 3

1

是的,您是对的:该else部分适用于除第一个节点之外的每个节点。并且该node1参数仅在将第一个节点添加到 [empty] 列表时修改一次。

于 2013-05-17T23:35:33.793 回答
0

第一次调用 add_to_list() 时,head 为 NULL,因此将 head 分配给具有正确数据的新节点。之后它不是 NULL,因此它将执行 else 部分,该部分转到列表的最后,然后将新创建的节点放在最后。如果它返回 0,则表明 malloc 存在问题并且未插入该数据。否则很好。只要您没有到达标准输入的“结尾”,feof() 就会返回 0,这允许您继续插入数据。

于 2013-05-17T23:51:26.543 回答
0

仅当 malloc 失败或整个列表为空时,您创建节点的函数才会返回 NULL。在创建节点函数中,您在整个列表中旋转以找到结束节点(将指向 NULL),并在那里插入新创建的节点

于 2017-06-27T17:32:40.013 回答