gpt4 book ai didi

c - 创建一个没有 malloc 的链表

转载 作者:行者123 更新时间:2023-12-02 05:50:21 24 4
gpt4 key购买 nike

为了创建一个链表(它将包含下一个和上一个节点的属性),我将使用 2 个下一个和上一个节点的指针,但我想知道我是否可以在不使用 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);
}

最佳答案

是的,你可以这样做。

例如

link l1,l2;
l1.next = &l2;
l2.next = NULL;

是一个完美有效的 2 个节点的链表。
您还可以创建一堆节点,并根据您的需要将它们链接在一起,例如创建 argv 的链表:
 int main(int argc, char *argv[])
int i;
link links[100];
for (i = 0; i < argc && i < 100; i++) {
//assuming the nodes can hold a char*
links[i].data = argv[i];
links[i].next = NULL;
if (i > 0)
links[i-1].next = &links[i];
}

当然也有一些缺点:
  • 在这些示例中,节点数是在编译时确定的。 (在最后一个例子中,我们可以为 argc 分配一个缓冲区
    节点而不是硬编码 100)
  • 这些节点的生命周期是它们声明的范围,当范围结束时它们不再存在。

  • 所以你不能做这样的事情:
     void append_link(link *n, char *data)
    {
    link new_link;
    n->next = &new_link;
    new_link.next = NULL;
    new_link.data = data;
    }

    那是无效的,因为当 append_link结束, new_link离开了。并且通过了 n->next现在指向一个无效的局部变量。如 new_link而是被 malloc'ed,它将超出此功能 - 一切正常。

    关于c - 创建一个没有 malloc 的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20055617/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com