【问题标题】:How to count number of nodes in a linked-list ?Why does the output show the count of nodes as '2'?如何计算链表中的节点数?为什么输出显示节点数为“2”?
【发布时间】:2020-06-27 13:15:58
【问题描述】:

我编写了一个 c 程序来查找链接列表中的节点数。但是问题出现了,因为我打印的计数值是“2”。

我的确切输出看起来像->

节点数为 2

我在这里做错了什么?

//the code for the program is here:-

#include<stdio.h>
#include<stdlib.h>

struct node
{
 int data;
 struct node *next;
}*first=NULL;

void create(int a[],int n)
{
 struct node *t,*last;
 first=(struct node *)malloc(sizeof(struct node));
 first->data=a[0];
 first->next=0;
 last=first;
 int i;
 for(i=1;i<n;i++)
 {
  t=(struct node *)malloc(sizeof(struct node));
  t->data=a[i];
  t->next=NULL;
  last->next=t;
  last=first;
 }
}

void count(struct node *p) //function to count number of nodes
{
 int count=0;
 while(p!=NULL)
 {
  count++;
  p=p->next;
 }
 printf("Number of nodes are %d ",count);
}

int main()
{
 int a[]={1,2,3,4};
 create(a,4);
 count(first);
 return 0;
}

【问题讨论】:

  • OT:使用可变宽度字体时,缩进宽度会丢失 1 个字符。建议每个缩进级别使用 4 个空格
  • OT:关于:first=(struct node *)malloc(sizeof(struct node));t=(struct node *)malloc(sizeof(struct node)); 1) 在 C 中,返回的类型是 void*,可以分配给任何指针。强制转换只会使代码混乱。建议拆除石膏。 2) 调用任何堆分配函数时:malloc()calloc() 和/或realloc() 始终检查 (!=NULL) 返回值以确保操作成功。 3)分配的内存在退出程序前没有传递给free(),导致内存泄漏
  • OT:关于:struct node { int data; struct node *next; }*first=NULL 不要隐藏指针。而是将结构定义与结构的实例分开。这可以提高代码的清晰度和灵活性

标签: c data-structures struct linked-list singly-linked-list


【解决方案1】:

我认为在函数create内的循环中

for(i=1;i<n;i++)

你是说

last = last->next;

而不是

last=first;

请注意,当函数依赖于全局变量时,将指向头节点的指针声明为全局变量是一个坏主意。

用户还可以将数组元素的数量等于 0 传递给函数。内存分配也可能失败。

我会通过以下方式声明函数

size_t create( struct node **head, const int a[], size_t n )
{
    // if the list is not empty free its nodes
    while ( *head != NULL )
    {
        struct node *current = *head;
        *head = ( *head )->next;
        free( current );
    }

    size_t i = 0;

    for ( ; i < n && ( *head = malloc( sizeof( struct node ) ) ) != NULL; i++ )
    {
        ( *head )->data = a[i];
        ( *head )->next = NULL;

        head = &( *head )->next;
    }

    return i;
}

然后像这样调用函数

size_t n = create( &first, a, sizeof( a ) / sizeof( *a ) );

在这种情况下,函数返回列表中创建的节点数。

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>

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

size_t create( struct node **head, const int a[], size_t n )
{
    // if the list is not empty free its nodes
    while ( *head != NULL )
    {
        struct node *current = *head;
        *head = ( *head )->next;
        free( current );
    }

    size_t i = 0;

    for ( ; i < n && ( *head = malloc( sizeof( struct node ) ) ) != NULL; i++ )
    {
        ( *head )->data = a[i];
        ( *head )->next = NULL;

        head = &( *head )->next;
    }

    return i;
}

void output( const struct node *head )
{
    for ( ; head != NULL; head = head->next )
    {
        printf( "%d -> ", head->data );
    }

    puts( "null" );
}

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

    int a[] = { 1, 2, 3, 4 };
    const size_t N = sizeof( a ) / sizeof( *a );

    size_t n = create( &head, a, N );

    printf( "There are %zu nodes in the list\n", n );

    printf( "They are " );

    output( head );

    return 0;
}

它的输出是

There are 4 nodes in the list
They are 1 -> 2 -> 3 -> 4 -> null

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2020-08-29
    • 2019-12-16
    • 2020-03-11
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多