c-创建不带malloc的链表

use*_*945 2 c malloc

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

我可以简单地创建一个具有格式化属性(值,指向下一个和上一个链接的指针)的新链接变量,并简单地将链中最后一个链接中的最后一个链接链接到此链接吗?例如,我的列表文件是b。

link i;
i.date=d;
getlast(b).next=&i
Run Code Online (Sandbox Code Playgroud)

对于我是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);
    }
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 6

是的,你可以这样做。

例如

link l1,l2;
l1.next = &l2;
l2.next = NULL;
Run Code Online (Sandbox Code Playgroud)

是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];
        }
Run Code Online (Sandbox Code Playgroud)

当然有一些缺点:

  • 在这些示例中,节点数是在编译时确定的。(在最后一个示例中,可以为argc 节点分配缓冲区,而不是硬编码100)
  • 这些节点的生存期是它们在其中声明的作用域,当作用域结束时它们不再存在。

因此,您不能执行以下操作:

 void append_link(link *n, char *data)
 {
      link new_link;
      n->next = &new_link;
      new_link.next = NULL;
      new_link.data = data;
 }
Run Code Online (Sandbox Code Playgroud)

那是无效的,因为当append_link结束时,new_link消失了。n->next现在传入的指向无效的局部变量。如果new_link不是malloc,它将超出此功能-一切正常。