如何更改C语言链表中节点的数据?



struct:

//linked list
struct list
{
int32_t data;
struct list *next;
};
struct list *head;

首先,初始化链表(每个节点为 0(:

void initLinkedList(int size)
{   
head = (struct list*)malloc(sizeof(struct list)*size);
struct list *current = head;
for(int i = 0; i < size; i++)
{
(current+i)->data= 0;
}
}

功能:

void changeNode(int32_t element, int index)
{   
struct list *current = head;
for (int i = 0; i < index; i++)
{
current = current->next;

} 
current->data= element;
}

所以基本上,我想创建一个包含size节点的链表,然后通过函数更改节点的数据。

但是我在功能上的这一行遇到了分段错误:current->localVar = element;

那么,如何在不插入新节点的情况下更改节点的数据呢?

您必须考虑是否已请求更改列表中不存在的索引,但除此之外,您已经接近了。您不是以传统方式迭代initLinkedList(您将列表视为数组(作为旁注:在 C 中,不需要强制转换malloc的返回,这是不必要的。请参阅:我是否投射了 malloc 的结果?

让我们从您的initLinkedList函数开始。您已经全局声明了head(假设(,然后用零填充您的列表。这样做时,您永远不会初始化任何->next指针。你最终不会得到一个链表——你有一个分配节点块。

您应该迭代current = current->next;并设置每个->next指针,而不仅仅是使用偏移+i。由于在连续块中分配所有节点,您可以像这样初始化data- 但是以后添加的任何节点都不会在内存中连续,并且不会初始化任何->next指针。

现在进入您的changeNode函数。您必须修复initLinkedList才能初始化->next指针。然后,您需要将返回类型从void更改为struct list*,以便可以在成功时返回指向已更改节点的指针,或者在失败时返回指向NULL的指针。目前,您无法知道更改是成功还是失败。

进行您可以执行的更改:

struct list *changeNode (int32_t element, int index)
{
struct list *current = head;
for (int i = 0; i < index; i++) {
if (!current->next) {
fputs ("error: request exceeds no. of nodes in list.n", stderr);
return NULL;
}
current = current->next;
}
current->data = element;
return current;
}

仔细查看,如果您有其他问题,请告诉我。

所以,在这里void initLinkedList(int size)你不是在创建/初始化链表,而是用sizeno. 动态声明一个struct list类型的数组。 元素,然后你用值0初始化所有这些元素。

要初始化您的linked list代码,请执行以下操作:

void initLinkedList(int size)
{
if((head = (struct list*)malloc(sizeof(struct list)*size)) == NULL)
{
printf("Memory Unavailable.n");
exit(1);
}
struct list *current = head;
for(int i = 0; i < size; i++)
{
current->data = 0;
if ((current->next = (struct list*)malloc(sizeof(struct list))) == NULL)
{
printf("Memory Unavailable.n");
exit(2);
}
current = current->next;
}
current->next = NULL;
}

然后要changeNode,编码如下:

void changeNode(int element, int index)
{
struct list *current = head;
int count = 0;
while(count != index)
{
if(current->next)
current = current->next;
count++;
}
current->data = element;
}

在这里,我添加了另一个函数来打印linked list

void print(struct list *head)
{
if(head->next)
{
printf("%d", head->data);
head = head->next;
print(head);
}
}

main()

int main(void)
{
initLinkedList(5);
changeNode(5, 4);
print(head);
delete(head);
printf("Memory freed.n");
return 0;
}

现在您可以看到示例输出:

00005
Memory freed.

还有一件事,如果你对此感到困惑:

if ((current->next = (struct list*)malloc(sizeof(struct list))) == NULL)

我可以帮你。在上面的代码行中,我们将内存分配给current->next并检查内存分配是否成功。

使用delete()函数释放分配给链表的内存:

void delete( struct list *head )
{
struct list *current = head;
struct list *next = NULL;
while(current != NULL)
{
next = current->next;
free(current);
current = next;
}
}

相关内容

  • 没有找到相关文章

最新更新