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;
}

私の疑問は、停止条件が p!=NULL である addafter 関数にあり、addbefore 関数の場合、その p->link!=NULL?..誰か説明してください!

4

1 に答える 1

2

単一のリンク リストにノードを追加するには、ノードを追加した後のノードへのポインターが必要です。

したがって、3 番目のノードの後に​​ノードを追加する場合は、3 番目のノードへのポインターが必要です。また、3 番目のノードの前にノードを追加する場合は、2 番目のノードへのポインターが必要です。

そのため、前後で必要なポインタは異なります。したがって、afterの場合、現在のポインター(pあなたの場合)はアイテムが一致するノードを指す必要がありますが、beforeの場合、現在のポインターはアイテムが一致するノードの前のノードを指す必要があります。

また、prev ポインターを保持することで、addbeforeケースを a で書き換えることもできます。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 に答える