【发布时间】:2013-11-18 18:57:11
【问题描述】:
为了创建一个链表(其中将包含下一个和上一个节点的属性),我将使用两个下一个和上一个节点的指针,但我想知道我是否可以在不使用 malloc 的情况下完成代码(分配内存): 例如: 而不是 malloc-ing:
link *const l = (link *)malloc(sizeof(link));
if(l == NULL)
/* Handle allocation failure. */
...
l->data = d;
l->next = list->head;
head = l;
我可以简单地创建一个具有格式化属性的新链接变量(值、指向下一个和上一个链接的指针),然后简单地将链中最后一个链接中的最后一个链接链接到这个链接吗? 例如,我的列表文件是 b。
link i;
i.date=d;
getlast(b).next=&i
我提前致歉,因为我是 c 新手,并且很高兴收到诚实的解决方案:D
编辑: 我尝试使用 malloc 来解决问题。如果有人能解决我在代码中的错误,我会很高兴,因为我似乎找不到它。
#include <stdio.h>
#include <malloc.h>
struct Node{
int value;
struct Node * Next;
struct Node * Previous;
};
typedef struct Node Node;
struct List{
int Count;
int Total;
Node * First;
Node * Last;
};
typedef struct List List;
List Create();
void Add(List a,int value);
void Remove(List a,Node * b);
List Create()
{
List a;
a.Count=0;
return a;
}
void Add(List a,int value)
{
Node * b = (Node *)malloc(sizeof(Node));
if(b==NULL)
printf("Memory allocation error \n");
b->value=value;
if(a.Count==0)
{
b->Next=NULL;
b->Previous=NULL;
a.First=b;
}
else
{
b->Next=NULL;
b->Previous=a.Last;
a.Last->Next=b;
}
++a.Count;
a.Total+=value;
a.Last=b;
}
void Remove(List a,Node * b)
{
if(a.Count>1)
{
if(a.Last==b)
{
b->Previous->Next=NULL;
}
else
{
b->Previous->Next=b->Next;
b->Next->Previous=b->Previous;
}
}
free(b);
}
【问题讨论】:
-
你可以吗?当然。您是否想要是有争议的,因为还有其他强大的方法可以将“链接”列表保存在自动存储中,并且按照您的方式进行操作有很多缺点。一个节点 array 包括数据和数组中下一个节点的索引就是这样的例子)。基于指针的链表的基本目的是提供动态扩展,我并不完全相信你对此很清楚。
-
这总是会在有人这样做时发布,但不要强制转换
malloc的返回值。 -
您的代码中的问题是“当该函数返回时,'i' 会去哪里?”
-
想想为什么传统的方法是使用malloc。您的版本是否解决了这些原因?
-
我为我的无知提前道歉;我明白使用指针的目的。我不明白如果我重用 i 变量会发生什么:我正在内存中创建一个节点。之后所以,我将列表中的最后一个节点链接到内存中创建的这个新节点。如果我重用 i 变量会发生什么,为什么我必须使用 malloc?