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正确。如果两个指针指向同一个结构放置(即具有相同的值),然后取消对其中任何一个的引用都会得到完全相同的结果。我明白了。感谢您的时间和解释。这真的很有帮助!