删除列表时头部如何连接到尾部

时间:2016-04-27 13:37:47

标签: c struct

我有一个基于给定数组创建列表的函数, 这是功能:

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

1 个答案:

答案 0 :(得分:4)

在循环的第一次迭代之后,headtail指向包含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  |
---------------    ---------------    ---------------