创建链接列表时,为了在元素之后和元素之前添加一些数据,我正在使用我从教程中学到的以下函数:
struct node *addafter(struct node *start,int data,int item)
{
struct node *tmp,*p;
p=start;
while(p!=NULL)
{
if(p->info==item)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->info=data;
tmp->link=p->link;
p->link=tmp;
return start;
}
p=p->link;
}
printf("Item Not Found:\n");
return start;
}
struct node *addbefore(struct node *start,int data,int item)
{
struct node *tmp,*p;
if(item==start->info)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->link=start->link;
tmp->info=data;
start->link=tmp;
return start;
}
p=start;
while(p->link!=NULL)
{
while(p->link->info==item)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->info=data;
tmp->link=p->link;
p->link=tmp;
return start;
}
p=p->link;
}
printf("Item Not Found:\n");
return start;
}
我怀疑是在addafter函数中为什么停止条件是p!= NULL而在addbefore函数的情况下它的p-> link!= NULL?..请任何人解释一下!
答案 0 :(得分:2)
要将节点添加到单个链接列表,您必须有一个指向节点的指针,然后添加节点。
因此,如果要在第3个节点之后添加节点,则需要指向第3个节点的指针。 如果要在第3个节点之前添加节点,则需要指向第2个节点的指针。
那么你之前和之后需要的指针是不同的。因此对于后一种情况,您当前的指针(在您的情况下为p
)需要指向项匹配的节点,而在之前的情况下,您的当前指针需要指向该项之前的节点匹配。
您还可以通过维护上一个指针,用addbefore
重写while(p!=NULL)
个案。
struct node *addbefore(struct node *start,int data,int item)
{
struct node *tmp,*p,*prv;
if(item==start->info)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->link=start->link;
tmp->info=data;
start->link=tmp;
return start;
}
p = start->link;
prv = start;
while(p != NULL)
{
if(p->info==item)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->info=data;
tmp->link=p;
prv->link=tmp;
return start;
}
prv = p;
p=p->link;
}
printf("Item Not Found:\n");
return start;
}
无论哪种方式编写前面的代码都没问题。