我有一个基于给定数组创建列表的函数, 这是功能:
typedef struct Item
{
int num;
struct Item* next;
}*PItem;
int main()
{
int Arr[N] = { 3, 4, 1, 0, 8 }, i;
PItem list = NULL, tail = NULL;
CreateListFromArray(&list, &tail, Arr);
}
void CreateListFromArray(PItem* head, PItem* tail, int *Arr)
{
int i;
PItem temp;
for (i = 0; i<N; i++)
{
temp = (PItem)malloc(sizeof(struct Item));
if (temp == NULL)
{
DeleteList(head);
Error_Msg("Memmory!");
}
temp->num = Arr[i];
temp->next = NULL;
if (*head == NULL)
*head = temp;
else
(*tail)->next = temp;
*tail = temp;
}
}
我理解如果List为空,则将head的null初始化为第一个分配的temp(arr[0]
)。但在此之后,对于这些数组arr[1],..,arr[N]
,我只更新尾部,这意味着从arr[1]
到arr[N]
的所有尾部都是连接的。但是头部(arr[0]
)POINTS /如何连接到arr[1]
?
我问这个是因为,当我尝试打印列表时,我使用temp = head
,然后前进直到temp为空,但是当我前进时,它怎么知道它必须前进到{{ 1}}?
以下是完整代码: http://pastebin.com/VPCfMU4X
答案 0 :(得分:4)
在循环的第一次迭代之后,head
和tail
指向包含arr[0]
的同一元素。第二次迭代后,(*tail)->next
(与(*head)->next
相同)指向包含arr[1]
的新元素,tail
向上移动到此值。后续迭代会继续追加到列表的末尾。
所以经过一次迭代,你得到了这个:
head tail
| |
v v
---------------
| 3 | NULL |
---------------
在第二次迭代之后,你有了这个:
head tail
| |
v v
--------------- ---------------
| 3 | .-----|--->| 4 | NULL |
--------------- ---------------
第三个:
head tail
| |
v v
--------------- --------------- ---------------
| 3 | .-----|--->| 4 | .-----|--->| 1 | NULL |
--------------- --------------- ---------------