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
来为节点分配内存。这样,您就不会局限于单个节点。
我刚刚学习了 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
来为节点分配内存。这样,您就不会局限于单个节点。