我正在尝试用C语言制作一个链表。我已经在我们在学校使用的 Turbo C++ 中启动并运行了该程序。当我尝试将代码放入代码块中时,我无法让它运行。我剥离了大部分代码,以便您可以看到调试时停止工作的部分。当它编译时,它不会说任何错误,而只是停止工作。我想这可能是因为我如何动态分配内存。
#include <stdio.h>
#include <stdlib.h>
struct data
{
int a;
int b;
};
struct node
{
struct data info;
struct node *urm;
};
struct lista
{
int lungime;
struct node *curent, *prim, *ultim;
};
struct lista *listax;
int creare(struct lista *LP)
{
LP->prim = (struct node*)malloc(sizeof(struct node));
LP->ultim = (struct node*)malloc(sizeof(struct node));
LP->prim->urm = LP->ultim;
LP->ultim->urm = NULL;
LP->curent=LP->prim;
LP->lungime = 0;
return 1;
}
int main()
{
creare(listax);
return 0;
}
我必须使用这种类型的声明,因为这是我们的老师希望我们呈现列表的方式(带有开始和结束节点)。任何帮助,不胜感激。
*编辑:
Prim 是第一个
ultim 是最后一个
lungime 是长度
urm 是下一个
您的内存分配确实不正确。在尝试分配给LP
的每个成员之前,必须为 LP 本身指向的结构分配空间,例如:
LP = malloc(sizeof(*LP));
其他建议
- 当你分配空间时,你通常应该检查分配函数的结果(
malloc()
/calloc()
/realloc()
),因为如果函数无法分配请求的内存,它可能会返回null
。您可以使用malloc()
后面的简单if
语句来执行此操作,例如:if (!LP) return -1;
- 不要强制转换
malloc()
的返回值。 - 通常最好在变量名称而不是类型上使用
sizeof
,例如LP->prim = malloc(sizeof(LP->prim));
- 每当您分配内存时,您应该记住在完成分配后释放分配的内存!使用
free()
执行此操作。如果你不释放内存,程序就会泄漏内存,也就是说,它每次分配的内存越来越多,最终计算机上的所有内存都被分配了,即使你的程序实际上只需要使用它分配的一点点。看到这个和这个。 正如@StoryTeller所指出的,使用空格来使你的代码可读 - 将它们聚集在一起,使其看起来更短,或者其他什么,并不能使它看起来很专业,它只是看起来不可读(因此很难让其他人帮助你)。
在某些书写系统中,使用空格来划分单词或分组信息可能不是常态(例如,一些中东语言不太重视或根本不重视它),但很多代码都是用美式英语编写的,确实如此。因此,编写同事、教师或贡献者可以轻松阅读的专业代码将涉及以这种方式使用空格,这将是你需要学习的东西,就像学习语言的语法一样。
这个问题可能是从代码风格开始的好点,但你也可以看看一些命名的C风格指南,如GNU,Linux内核,BSD等
。