c - 使用 for 循环在 C 中创建链接列表以分配值
问题描述
我正在尝试使用分配值的 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;
}
虽然在这个程序中,head 指向 0,但有没有办法让 for 循环从 0 开始一直到 n 并且仍然产生相同的输出。我希望它看起来像(int for count = 0; count < n; count++)。这只是我想知道的一种偏好。知道的请帮忙,谢谢!
解决方案
首先,在您的代码中,您不需要额外的tempNode
,只需使用temp
并将其设置为内部块的本地:
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
,但是一旦你掌握了它,它就是一个有用的工具。如果您(还)对它不满意,请使用第一个变体。
只为创建转发列表而付出努力是否值得?在前面插入列表很容易,整理后,您的原始变体对我来说看起来干净紧凑。
推荐阅读
- git - 公关评论后保持干净的历史记录
- azure-sql-database - Manage Compression Wizard Cannot Show Requested Dialog
- julia - Julia 1.1 - Julia refers to home directory though a different depot path is specified
- r - 使用 If 处理使用 Shiny R 的输入和列名
- c# - 通过 P/Invoke 从 C# 将可写字符串数组传递给 C++
- excel - Creating Dynamic Links in an Excel Calendar
- ios - Flutter iOS app needs passcode for Google Sign In
- javascript - Bootstrap 4 tooltip with dynamic title (ajax request)
- kubernetes - Can't get response from https://kubernetes.default
- c++ - 连续使用相同输入的 ID3D11DeviceContext 状态调用的成本?