【问题标题】:Process in which new nodes are added to a linked list in CC中将新节点添加到链表的过程
【发布时间】:2013-05-17 23:30:36
【问题描述】:

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

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 的节点(最后一个),然后从那里创建一个新节点并将其连接到最后一个节点。我对吗?还是我错过了什么?

谢谢。

【问题讨论】:

  • feof 可能不像你想象的那样工作。而且您不必在 C 程序中强制转换 malloc 的返回值。

标签: c list pointers linked-list allocation


【解决方案1】:

是的,你是对的:else 部分适用于除第一个节点之外的每个节点。而node1参数只在第一个节点加入[empty]列表时修改一次。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-14
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多