为了创建一个链表(它将包含下一个和上一个节点的属性),我将使用两个下一个和上一个节点的指针,但是我想知道是否可以在不使用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)
是的,你可以这样做。
例如
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,它将超出此功能-一切正常。
| 归档时间: |
|
| 查看次数: |
5599 次 |
| 最近记录: |