我需要创建一个存储整数数据的链表。此列表还需要知道其大小(列表中的项目数)。
这是我的代码。
typedef struct node Node;
struct node{
int a;
Node* b;
};
Node m;
typedef struct {
node* head;
int size;
}list;
list list1;
#include <stdio.h>
#include "linked.h"
list init(list list1)
{
list1.head = null;
list1.size = 0;
return list1;
}
void main()
{
list1=init(list1);
printf("%d",list1.size);
}
现在正在运行,结果是 - “无法创建进程”, 在Windows上使用Turbo C.
答案 0 :(得分:1)
有两个错误:首先,您应该写Node* head;
而不是node* head;
,其次,您应该写NULL
或0
而不是null
可能你的编译器消息被某种方式抑制了。
而且,是的,这就是你如何发起链表,但是
list init(void)
{
list list1;
list1.head = null;
list1.size = 0;
return list1;
}
会更好。
也可以进行其他改进。
答案 1 :(得分:0)
您的标头不应定义list list1;
,尽管它可能会声明extern list list1;
。但是,为了通常可重用,标头不应声明变量。 (见What are extern variables in C。)
您的标题中应包含多个包含警戒。 (见Should I use #include in headers。)
您的标题应声明为操作列表而提供的函数。
您应该有一个实现文件来实现列表操作函数(linked.c
将与标题名称linked.h
一致)。然后主程序将简单地使用这些功能。
您的main()
程序通常应该有返回类型int
;这是标准C所要求的。您的编译器可能有另一种选择。
如果您的类型始终大写,而不是使用Node
和list
,那就太好了。
您的init()
功能命名不佳。它的设计也很差。您不需要输入值和返回值。您的代码将传入的结构视为一个方便分配的局部变量,并将其初始化并将其复制回来;它也可以在没有参数的情况下工作,并且list list1;
被定义为局部变量。并且您应该避免在参数列表中使用与全局变量相同的名称(或作为局部变量)。编译器不会被它混淆;你可能是。使用它会更常规:
static void list_init(list *new_list)
{
new_list->head = 0;
new_list->size = 0;
}
和
list_init(&list1);
尽管如此,仍然没有明显的理由说你的程序不会运行。
一个奇怪的可能性是你的init()
函数混淆了通常运行它自己的函数init()
的运行时,并且你的初始化没有按照编译器的期望进行。
否则,你能编译并运行任何程序 - 一个'Hello World'程序吗?如果你可以编译和运行程序,那么你的程序就会对系统产生不利影响 - init()
函数占据中心位置。如果你不能运行一个简单的'Hello Program',那么你需要修改你的编译器安装。