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)
你不是在创建/初始化链表,而是用size
no. 动态声明一个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;
}
}