C中有没有办法在没有内存分配的情况下在链表中创建新节点?

Is there a way in C to create new nodes in a linked list without memory allocation?

我刚刚学习了 C 中链表的概念,并尝试实现它。我所做的是创建一个指针 head 和一个指针 itr。要创建一个新节点,我会正常初始化一个节点(不使用指针),然后将一个指针附加到它。

struct node temp;    //A single node contains a value 'num' and a pointer to the next node.
temp.num=x;
temp.next=NULL;

if(head==NULL){
    head=&temp;
}
else{
    itr=head;
    while(itr->next!=NULL){
        itr=itr->next;
    }
    itr->next=&temp;
}

此方法无效,基于我对 C 指针的有限了解,我无法弄清楚原因。我知道正确的方法是使用 malloc 创建新节点,但我需要知道为什么这种方法不起作用。

完整节目:

#include <stdio.h>

struct node{
    int num;
    struct node *next;
};

int main(){
    struct node *head=NULL;
    struct node *itr;
    struct node temp;

    int choice;
    printf("1. Enter new Node, 2. Traverse all nodes, 3. Exit.");

    int x;
    while(1){
        printf("\nEnter your choice: ");
        scanf("%d", &choice);

        if(choice==1){
            printf("Enter value: ");
            scanf("%d", &x);

            
            temp.num=x;
            temp.next=NULL;

            if(head==NULL){
                head=&temp;
            }
            else{
                itr=head;
                while(itr->next!=NULL){
                    itr=itr->next;
                }
                itr->next=&temp;
            }
        }

        else if(choice==2){
            if(head==NULL){
                printf("Empty List");
                continue;
            }
            printf("The values are: ");
            itr=head;
            printf("%d ", itr->num);
            while(itr->next!=NULL){
                itr=itr->next;
                printf("%d ", itr->num);
            }
        }

        else{
            break;
        }
    }
}

您必须展示您的完整代码。 我想,在你的情况下,如果你定义这样的函数,temp elem 是函数局部变量,你需要使用 malloc 使其可以从函数中访问。

int addNode(struct node *head, inx x) {
struct node temp;    //A single node contains a value 'num' and a pointer to the next node.
temp.num=x;
temp.next=NULL;

if(head==NULL){
    head=&temp;
}
else{
    itr=head;
    while(itr->next!=NULL){
        itr=itr->next;
    }
    itr->next=&temp;
}
}

一个链表一般由若干个节点组成,每个节点指向链表中的下一个节点。链表中的最后一个节点应指向NULL以标记链表的结尾。

但是,您只为单个节点分配了内存。因此,您将只能在链表中存储单个节点。

添加第一个节点到链表的代码是正确的。但是,添加第二个节点的代码无法运行,因为您还没有为第二个节点分配任何内存。

你添加第二个节点的代码实际上是在覆盖第一个节点,并使第一个节点指向它自己。这就是为什么你会得到一个无限循环,如果你试图在之后打印链表。

因此,我建议您改用 malloc 来为节点分配内存。这样,您就不会局限于单个节点。