gpt4 book ai didi

在 C 中使用 for 循环创建链表并赋值

转载 作者:行者123 更新时间:2023-11-30 16:11:48 25 4
gpt4 key购买 nike

我正在尝试使用分配值的 for 循环为我的程序创建一个链接列表。在创建这个链表时,我希望能够跟踪头部并将 for 循环中的第一个值分配给头部。例如,如果我要创建一个从 0 到 n - 1 的列表,我希望头部指向 0,列表的其余部分后面跟着 1-2-3-4-...-n-1。我已经编写了一个循环来执行此操作,但是 for 循环必须向后而不是向前倒数。这是我的代码:

// Structure
typedef struct node {
int value;
struct node * next;
} ListNode;

int size = "some value";

ListNode * head = NULL; // beginning of the linked list
ListNode * temp; // temporary node

for(int count = size - 1; count >= 0; count--)
{
// creates temporary nodes //
ListNode * tempNode = malloc(sizeof(ListNode));
tempNode -> value = count;
tempNode -> next = NULL;
// creation of node completed

temp = tempNode;
temp -> next = head;
head = temp;
}

虽然在这个程序中,头按照我的意图指向 0,但有没有办法让 for 循环从 0 开始一直到 n 并且仍然产生相同的输出。我希望它看起来像 (int for count = 0; count < n; count++)。这只是我想知道是否可能的偏好。知道的请帮忙,谢谢!

最佳答案

首先,在您的代码中,您不需要额外的 tempNode,只需使用 temp 并将其设置为内部 block 的本地即可:

for (int count = size; count--; ) {
ListNode *temp = malloc(sizeof(*temp));

temp->value = count;
temp->next = head;
head = temp;
}

如果你想在末尾追加元素,你应该保留一个指向最后一个节点的指针,即tail:

ListNode *head = NULL;
ListNode *tail = NULL;

for (int count = 0; count < size; count++) {
ListNode *temp = malloc(sizeof(*temp));

temp->value = count;
temp->next = NULL;

if (tail == NULL) {
head = temp;
tail = temp;
} else {
tail->next = temp;
tail = temp;
}
}

有一种更优雅的方法可以做到这一点:不保留指向最后一个节点的指针,而是保留指向下一个元素应该所在的空指针的指针:

ListNode *head = NULL;
ListNode **tail = &head;

for (int count = 0; count < size; count++) {
ListNode *temp = malloc(sizeof(*temp));

temp->value = count;
temp->next = NULL;

*tail = temp;
tail = &(*tail)->next;
}

开始时,*tail保存的是head的地址,之后保存的是最后一个next成员的地址节点。您可以通过指针 tail 更新两者,而无需检查列表是否为空。

最后一个方法的 ListNode **tail 乍一看有点令人畏惧,但是一旦掌握了它的窍门,它就是一个有用的工具。如果您对此还不满意,请使用第一个变体。

仅仅为了创建转发列表值得付出努力吗?在前面插入列表很容易,整理后,您的原始变体对我来说看起来干净而紧凑。

关于在 C 中使用 for 循环创建链表并赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58497606/

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