链表C程序不产生输出



我在链表上阅读,我能找到的唯一好的来源是斯坦福计算机图书馆的一个。我希望实现我从中学到的东西,并在我的编译器上运行它。程序的目的是找出{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哪里出错了,我做错了什么?

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

其次,您永远不会调用您定义的任何函数。你的main()函数除了return 0;之外什么都不做。

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

我认为这种类型的帖子属于其他地方(stackoverflow也许?)。在任何情况下,您都定义了一个函数BuildOneTwoThree(),并且没有调用它,因此它不输出任何内容。

尝试使用标准的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 %dn" , length ) ;
  int i = 0 ;
  for ( LLNODE *p = root ; p != NULL ; p = p->next )
  {
    printf( "Node #%d.tcontains the value %dn" , ++i , p->payload ) ;
  }
  return 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));
}

相关内容

  • 没有找到相关文章

最新更新