添加到列表功能

时间:2018-01-20 12:28:06

标签: c list pointers linked-list singly-linked-list

我正在尝试编写一个在列表末尾插入节点的函数。

问题是列表的最后一个节点的指针没有指向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;
};

3 个答案:

答案 0 :(得分:3)

是的,因为您插入的第一个节点 - next 的值为NULL

struct node *node = NULL; //<------
node = AddToList(node, 30);
node = AddToList(node, 20);
node = AddToList(node, 10);
showlist(node);

这将解决问题。现在作为这样做的结果 - 第一次插入节点时,next将被赋予值NULL。因为第一次调用AddToList listNULL

你这样做的方式 - node包含一些不确定的值(垃圾值)(node是一个具有自动存储持续时间的变量)然后将其作为link添加到第一个节点。这没有实际用处,因为现在您无法遍历列表,认为您将找到NULL值,这是您应该停止的时间。

从标准章节§6.7.9

  

如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。

您应该检查malloc的返回值。万一它失败了 - 你应该处理那个案子。完成后,释放动态分配的内存。

还不确定你是如何尝试显示列表的,但是如果它假设最后一个节点将指向NULL然后开始循环它 - 那么你在代码中获得了未定义的行为。

答案 1 :(得分:1)

  

尝试编写一个在节点末尾插入节点的函数   列表。

此功能

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。

  

问题是列表的最后一个节点的指针不是   指向NULL

因为在未初始化的第一个节点之前插入了新节点

struct node *node;

因此具有不确定的值,列表中的最后一个节点不指向NULL。

您必须将初始指针设置为NULL。

struct node *node = NULL;

考虑到根据C标准,没有参数的函数main应声明为

int main( void )

答案 2 :(得分:-1)

当用户想要在最后一次检查时添加节点是否为空列表,如果是这样意味着将新节点添加为头节点。如果列表不为空,则通过列表查找并通过检查tp-找出最后一个节点&gt; next = NULL然后将新节点的地址存储在tp-> gt; next并使新节点的下一个字段为NULL。以下程序清楚地显示概念

#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                                                                                                                                                                                           
希望你明白。谢谢你