链表C程序不产生输出

时间:2014-08-20 20:02:11

标签: c linked-list

我正在阅读链接列表,我能找到的唯一好消息来自斯坦福CS图书馆。我希望实现我从中学到的东西,并在我的编译器上运行它。该程序用于查找{1,2,3}链接列表中的元素数量。

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

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

int main()
{
  struct node* BuildOneTwoThree()
  {
    struct node* head   = NULL;
    struct node* second = NULL;
    struct node* third  = NULL;

    head   = malloc(sizeof(struct node)); // allocate 3 nodes in the heap
    second = malloc(sizeof(struct node));
    third  = malloc(sizeof(struct node));

    head->data = 1; // setup first node
    head->next = second; // note: pointer assignment rule

    second->data = 2; // setup second node
    second->next = third;

    third->data = 3; // setup third link
    third->next = NULL;

    return head;

    int Length(struct node* head)
    {
      struct node* current = head;
      int count = 0;

      while (current != NULL)
      {
        count++;
        current = current->next;
      }

      printf("%d",count);
      return count;
    }

  }
  return 0;
}

它返回空白。我不明白O在哪里弄错了,我做错了什么?

4 个答案:

答案 0 :(得分:3)

首先,您尝试在main()函数中定义函数。 BuildOneTwoThreemain内定义,而Length似乎在BuildOneTwoThree内定义。你为什么那样做? C语言没有这样的功能。您无法嵌套函数定义。所有功能都必须在文件级别单独定义。

其次,您永远不会调用您定义的任何函数。除main()之外,您的return 0;函数不执行任何操作。

看看任何有效的C程序,你应该立即弄清楚应该如何定义函数。请注意,虽然某些编译器支持嵌套函数定义作为非标准扩展,但您仍需要在某些时候调用函数。

答案 1 :(得分:0)

我认为这种帖子属于其他地方(stackoverflow可能?)。在任何情况下,您正在定义一个函数BuildOneTwoThree(),而您不会调用它,因此它不会输出任何内容。

答案 2 :(得分:0)

你缺少一个大括号来结束BuildOneTwoThree()函数,那么你必须在main中调用该函数。试试这个:

#include <stdio.h>
#include <stdlib.h>
struct node {

int data;
struct node* next;

};

struct node* BuildOneTwoThree() {
struct node* head = NULL;
            struct node* second = NULL;
            struct node* third = NULL;
            head = malloc(sizeof(struct node)); // allocate 3 nodes in the heap
            second = malloc(sizeof(struct node));
            third = malloc(sizeof(struct node));
            head->data = 1; // setup first node
            head->next = second; // note: pointer assignment rule
            second->data = 2; // setup second node
            second->next = third;
            third->data = 3; // setup third link
            third->next = NULL;
            return head;
        }

int Length(struct node* head) {
            struct node* current = head;
            int count = 0;
            while (current != NULL) {
                count++;
                current = current->next;
                }
            return count;
        }

int main(){
    struct node* newNode = BuildOneTwoThree();
    printf("%d",Length(newNode));
}

答案 3 :(得分:0)

尝试使用标准C并格式化代码,使其可读。

如果你分解事情,你会得到类似的东西:

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

typedef struct LLNODE
{
  struct LLNODE *next ;

  int payload ;

} LLNODE ;

LLNODE *create_node( int value )
{
  LLNODE *p = calloc( 1 , sizeof(LLNODE) ) ;

  p->next    = NULL  ;
  p->payload = value ;

  return p ;
}

LLNODE *create_list( int start_value , int count )
{
  LLNODE *root = NULL ;
  LLNODE *tail = NULL ;

  for ( int i = 0 , value = start_value ; i < count ; ++i )
  {
    LLNODE *node = create_node( value++ ) ;

    if ( root == NULL )
    {
      root = tail = node ;
    }
    else
    {
      tail->next = node ;
      tail = node ;
    }

  }

  return root ;
}

int compute_length( LLNODE *root )
{
  int len = 0 ;

  for ( LLNODE *p = root ; p != NULL ; p = p->next )
  {
    ++len ;
  }

  return len ;
}

int main( int argc, char *argv[] )
{
  LLNODE *root   = create_list( 101 , 50 ) ;
  int     length = compute_length( root ) ;

  printf( "list length is %d\n" , length ) ;

  int i = 0 ;
  for ( LLNODE *p = root ; p != NULL ; p = p->next )
  {
    printf( "Node #%d.\tcontains the value %d\n" , ++i , p->payload ) ;
  }

  return 0 ;
}