Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除列表时,头部如何连接到尾部_C_Struct - Fatal编程技术网

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

C 删除列表时,头部如何连接到尾部,c,struct,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 Cre

我有一个函数,它根据给定的数组创建一个列表, 这就是功能:

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;
    }
}
typedef结构项
{
int-num;
结构项*下一步;
}*皮特姆;
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;
岩芯温度;
对于(i=0;inum=Arr[i];
temp->next=NULL;
如果(*head==NULL)
*压头=温度;
其他的
(*尾部)->下一个=温度;
*尾=温度;
}
}
我知道如果列表为空,那么head的null将初始化为第一个分配的temp(
arr[0]
)。但是在这之后,对于这些数组
arr[1],…,arr[N]
,我只更新尾部,这意味着从
arr[1]
arr[N]
的所有尾部都是连接的。但是head(
arr[0]
)是如何连接的呢点/连接到
arr[1]

我这样问是因为,当我试图打印列表时,我使用
temp=head
,并将head提前到temp为null,但当我将head提前时,它如何知道它必须提前到
arr[1]


这是完整的代码:

在循环的第一次迭代之后,
指向包含
arr[0]
的相同元素。在第二次迭代之后,
(*tail)->next
(与
(*head)->next
)指向包含
arr[1]的新元素
,而
tail
将上移到此值。后续迭代将继续追加到列表的末尾

因此,在一次迭代之后,您有:

头尾
|         |
v v
---------------
|3 |零|
---------------
在第二次迭代之后,您将看到:

头尾
|                       |
v v
---------------    ---------------
|3 |.----|-->| 4 |空|
---------------    ---------------
第三点:

头尾
|                                          |
v v
---------------    ---------------    ---------------
|3 |。-->4 |。-->1 |空|
---------------    ---------------    ---------------

在循环的第一次迭代之后,
指向包含
arr[0]
的同一个元素。在第二次迭代之后,
(*tail)->next
(与
(*head)->next
指向包含
arr[1]的新元素
,而
tail
将上移到此值。后续迭代将继续追加到列表的末尾

因此,在一次迭代之后,您有:

头尾
|         |
v v
---------------
|3 |零|
---------------
在第二次迭代之后,您将看到:

头尾
|                       |
v v
---------------    ---------------
|3 |.----|-->| 4 |空|
---------------    ---------------
第三点:

头尾
|                                          |
v v
---------------    ---------------    ---------------
|3 |。-->4 |。-->1 |空|
---------------    ---------------    ---------------

int-Arr[N]={3,4,1,0,8},
这似乎不正确。@ameyCU实际上
int-Arr[N]={3,4,1,0,8},i;
是正确的,即使它看起来很奇怪。@IlanAizelmanWS您在pastebin上的代码缺少
ListDisplay
函数。您编写了这段代码,忘记了它是如何工作的,现在无法在调试器下运行它来发现它?@IlanAizelmanWS…那么,不要声称它运行。
int Arr[N]={3,4,1,0,8},
这似乎不正确。@ameyCU实际上
intarr[N]={3,4,1,0,8},i;
是正确的,即使它看起来很奇怪。@IlanAizelmanWS您在pastebin上的代码缺少
ListDisplay
函数。您编写了这段代码,忘记了它是如何工作的,现在无法在调试器下运行它来发现它?@IlanAizelmanWS…那么,请不要声称它运行了。非常感谢dbush。快速提问,在第二次迭代中s和tail的next是相同的,因为它们都指向相同的结构?@IlanAizelmanWS正确。如果两个指针指向相同的位置(即具有相同的值),然后取消对其中任何一个的引用都会得到完全相同的结果。我明白了。谢谢你的时间和解释。这真的很有帮助!非常感谢dbush。快速提问,在第二次迭代中,头和尾的下一个是相同的,因为它们都指向同一个结构?@IlanAizelmanWS正确。如果两个指针指向同一个结构放置(即具有相同的值),然后取消对其中任何一个的引用都会得到完全相同的结果。我明白了。感谢您的时间和解释。这真的很有帮助!