我知道该程序是如何工作的,但我无法理解这个概念。这是主要功能:
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 的节点(最后一个),然后从那里创建一个新节点并将其连接到最后一个节点。我对吗?还是我错过了什么?
谢谢你。