0

在创建链接列表以便在元素之后和元素之前添加一些数据时,我使用了以下函数,正如我从教程中学到的:

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?..请任何人解释一下!

4

1 回答 1

2

要将节点添加到单个链接列表,您必须有一个指向该节点的指针,然后添加该节点。

因此,如果要在第 3 个节点之后添加一个节点,则需要一个指向第 3 个节点的指针。如果你想在第三个节点之前添加一个节点,你需要一个指向第二个节点的指针。

所以之前和之后需要的指针是不同的。因此,对于后一种情况,您的当前指针(p在您的情况下)需要指向项目匹配的节点,而在前一种情况下,您的当前指针需要指向项目匹配之前的节点。

您还可以通过维护 prev 指针来addbefore用 a 重写 case 。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;
}

编写之前的代码的任何一种方式都很好。

于 2013-04-22T08:14:30.217 回答