添加到列表功能
Add to list function
我正在尝试编写一个在列表末尾插入节点的函数。
问题是列表的最后一个节点的指针没有指向 NULL,如果我显示列表,系统会出错。
struct node{
int value;
struct node *next;
};
struct node *AddToList (struct node *list, int n);
int main()
{
struct node *node;
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);
return 0;
}
struct node *AddToList (struct node *list, int n){
struct node *new_node;
new_node=malloc(sizeof(struct node));
new_node->value=n;
new_node->next=list;
return new_node;
};
是的,那是因为您插入的第一个节点 - next
是 而不是 ,其值为 NULL
.
struct node *node = NULL; //<------
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);
这将解决问题。现在,作为这样做的结果 - 第一次插入节点时,它的 next
将被分配值 NULL
。因为第一次调用 AddToList
时 list
是 NULL
.
你这样做的方式 - node
包含一些不确定的值(垃圾值)(node
是一个具有自动存储持续时间的变量)然后将其添加为 link
到第一个节点。这没有实际用处,因为现在您无法遍历列表并认为您会找到一个 NULL
值,该值是您应该停止的时间。
来自标准章节§6.7.9
If an object that has automatic storage duration is not initialized
explicitly, its value is indeterminate.
您应该检查 malloc
的 return 值。万一它失败了——你应该处理这种情况。并在使用完后释放动态分配的内存。
也不确定您是如何尝试显示列表的,但是如果假设最后一个节点将指向 NULL
然后开始循环它 - 那么您在您的中获得了未定义的行为代码。
'm trying to write a function that inserts node at the end of the
list.
这个函数
struct node *AddToList (struct node *list, int n){
struct node *new_node;
new_node=malloc(sizeof(struct node));
new_node->value=n;
new_node->next=list;
return new_node;
};
不在列表末尾插入节点。它在头节点之前的列表开头插入一个节点。
在列表末尾插入一个节点的函数可以看下面的方式。
int AddToList ( struct node **list, int n )
{
struct node *new_node = malloc( sizeof( struct node ) );
int success = new_node != NULL;
if ( success )
{
new_node->value = n;
new_node->next = NULL;
while ( *list != NULL ) list = &( *list )->next;
*list = new_node;
}
return success;
}
而且函数可以这样调用
struct node *head = NULL;
AddToList( &head, 10);
AddToList( &head, 20);
AddToList( &head, 30);
如果您希望列表值的顺序为 10、20、30。
The problem is that the pointer of the last node of the list doesn't
point to NULL
因为新节点插入到第一个未初始化的节点之前
struct node *node;
因此具有不确定的值,列表中的最后一个节点不指向 NULL。
您必须将初始指针设置为 NULL。
struct node *node = NULL;
考虑到根据 C 标准,不带参数的函数 main 应声明为
int main( void )
当用户想在最后添加节点时首先检查它是否为空列表如果是则意味着将新节点添加为头node.if列表不为空遍历列表并找出最后一个节点通过检查 tp->next=NULL 然后将新节点的地址存储在 tp->next 中并使新节点的下一个字段 NULL.the 下面的程序清楚地显示了概念
#include<stdio.h>
#include<malloc.h>
int item,count,pos;
struct node
{
int info;
struct node *next;
}*head,*tp;
void traversal()
{
if(head==NULL)
printf("\n List is empty");
else
{
tp=head;
while(tp->next!=NULL)
{
printf("\n%d",tp->info);
tp=tp->next;
}
printf("\n%d",tp->info);
}
}
void insertlast()
{
struct node *temp;
temp=(struct node*) malloc(sizeof(temp));
printf("\nEnter the element:");
scanf("%d",&item);
temp->info=item;
temp->next=NULL;
if(head==NULL)
head=temp;
else
{
tp=head;
while(tp->next!=NULL)
{
tp=tp->next;
}
tp->next=temp;
}
}
int main()
{
printf("\n\t\t**********SINGLY LINKED LIST********");
printf("\n\t------------------------------------------------------");
printf("\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
return 0;
}
输出
**********SINGLY LINKED LIST********
------------------------------------------------------
Insertion last:
---------------------
Enter the element:12
12
Insertion last:
---------------------
Enter the element:13
12
13
Insertion last:
---------------------
Enter the element:14
12
13
14
Insertion last:
---------------------
Enter the element:15
12
13
14
15
希望你understand.Thank你
我正在尝试编写一个在列表末尾插入节点的函数。
问题是列表的最后一个节点的指针没有指向 NULL,如果我显示列表,系统会出错。
struct node{
int value;
struct node *next;
};
struct node *AddToList (struct node *list, int n);
int main()
{
struct node *node;
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);
return 0;
}
struct node *AddToList (struct node *list, int n){
struct node *new_node;
new_node=malloc(sizeof(struct node));
new_node->value=n;
new_node->next=list;
return new_node;
};
是的,那是因为您插入的第一个节点 - next
是 而不是 ,其值为 NULL
.
struct node *node = NULL; //<------
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);
这将解决问题。现在,作为这样做的结果 - 第一次插入节点时,它的 next
将被分配值 NULL
。因为第一次调用 AddToList
时 list
是 NULL
.
你这样做的方式 - node
包含一些不确定的值(垃圾值)(node
是一个具有自动存储持续时间的变量)然后将其添加为 link
到第一个节点。这没有实际用处,因为现在您无法遍历列表并认为您会找到一个 NULL
值,该值是您应该停止的时间。
来自标准章节§6.7.9
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.
您应该检查 malloc
的 return 值。万一它失败了——你应该处理这种情况。并在使用完后释放动态分配的内存。
也不确定您是如何尝试显示列表的,但是如果假设最后一个节点将指向 NULL
然后开始循环它 - 那么您在您的中获得了未定义的行为代码。
'm trying to write a function that inserts node at the end of the list.
这个函数
struct node *AddToList (struct node *list, int n){
struct node *new_node;
new_node=malloc(sizeof(struct node));
new_node->value=n;
new_node->next=list;
return new_node;
};
不在列表末尾插入节点。它在头节点之前的列表开头插入一个节点。
在列表末尾插入一个节点的函数可以看下面的方式。
int AddToList ( struct node **list, int n )
{
struct node *new_node = malloc( sizeof( struct node ) );
int success = new_node != NULL;
if ( success )
{
new_node->value = n;
new_node->next = NULL;
while ( *list != NULL ) list = &( *list )->next;
*list = new_node;
}
return success;
}
而且函数可以这样调用
struct node *head = NULL;
AddToList( &head, 10);
AddToList( &head, 20);
AddToList( &head, 30);
如果您希望列表值的顺序为 10、20、30。
The problem is that the pointer of the last node of the list doesn't point to NULL
因为新节点插入到第一个未初始化的节点之前
struct node *node;
因此具有不确定的值,列表中的最后一个节点不指向 NULL。
您必须将初始指针设置为 NULL。
struct node *node = NULL;
考虑到根据 C 标准,不带参数的函数 main 应声明为
int main( void )
当用户想在最后添加节点时首先检查它是否为空列表如果是则意味着将新节点添加为头node.if列表不为空遍历列表并找出最后一个节点通过检查 tp->next=NULL 然后将新节点的地址存储在 tp->next 中并使新节点的下一个字段 NULL.the 下面的程序清楚地显示了概念
#include<stdio.h>
#include<malloc.h>
int item,count,pos;
struct node
{
int info;
struct node *next;
}*head,*tp;
void traversal()
{
if(head==NULL)
printf("\n List is empty");
else
{
tp=head;
while(tp->next!=NULL)
{
printf("\n%d",tp->info);
tp=tp->next;
}
printf("\n%d",tp->info);
}
}
void insertlast()
{
struct node *temp;
temp=(struct node*) malloc(sizeof(temp));
printf("\nEnter the element:");
scanf("%d",&item);
temp->info=item;
temp->next=NULL;
if(head==NULL)
head=temp;
else
{
tp=head;
while(tp->next!=NULL)
{
tp=tp->next;
}
tp->next=temp;
}
}
int main()
{
printf("\n\t\t**********SINGLY LINKED LIST********");
printf("\n\t------------------------------------------------------");
printf("\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
printf("\n\n\tInsertion last:");
printf("\n\t---------------------");
insertlast();
traversal();
return 0;
}
输出
**********SINGLY LINKED LIST********
------------------------------------------------------
Insertion last:
---------------------
Enter the element:12
12
Insertion last:
---------------------
Enter the element:13
12
13
Insertion last:
---------------------
Enter the element:14
12
13
14
Insertion last:
---------------------
Enter the element:15
12
13
14
15
希望你understand.Thank你