我在链表上阅读,我能找到的唯一好的来源是斯坦福计算机图书馆的一个。我希望实现我从中学到的东西,并在我的编译器上运行它。程序的目的是找出{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()
函数中定义函数。BuildOneTwoThree
在main
中定义,而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));
}