0

特定の単一リンクリストの方向を逆にするプログラムを作成します。言い換えると、反転後、すべてのポインターが逆方向を指すようになります。

私は上記の問題を解決しようとしています。単一リンクリストの挿入、検索、削除、印刷の機能を作成しました。

私の印刷機能は次のとおりです

void print(list **l)
{
    list *p=*l;
    for(int i=0;p;i++)
    {
        cout<<p->item<<endl;
        p=p->next;
    }
}

リスト内のすべての値を正常に出力します。

しかし、私がこのように同じ割り当てを行う場合、メイン関数で

list *p=*l;

セグメンテーション違反が発生します。私の主な機能は次のとおりです

main()
{
    list **l;
    *l=NULL;
    int n;
    while(cin>>n)
    insert(l,n);
    list *p=*l;
    list *prev=NULL;
    list *next;
    while(p)
    {
        next=p->next;
        p->next=prev;
        prev=p;
        if(next==NULL)
        *l=p;
        p=next;
    }       
    print(l);
}

私の挿入機能は次のとおりです

void insert(list **l,int x)
{
    list *p;
    p=(list *)malloc(sizeof(list));
    p->item=x;
    p->next=*l;
    *l=p;
}

印刷機能とメイン機能で行う割り当ての違いは何ですか?印刷機能でエラーが発生せず、メイン機能でセグメンテーション違反が発生するのはなぜですか?

私の関数がこのような場合

main()
{
    list **l;
    *l=NULL;
    int n;
    while(cin>>n)
    insert(l,n);
    print(l);
}

リストの値を挿入して印刷することができますが、エラーは発生しません。

4

2 に答える 2

3

あなたが書くとき

list **l;
*l=NULL;

無効なポインタを逆参照しているため、未定義の動作が発生します。

関数内では、おそらく引数として有効なポインターを渡しています。例えば

list* l;
void print(&l)

この場合、&llist**-型であり、ぶら下がっているを指しているlist*ため、間接参照するとポインタ(lそれ自体)が生成されます。l初期化されていませんが、そこから読み取っていなくても問題ありません。

于 2013-02-19T11:57:47.340 に答える
1

あなたが書く:

list **l;
*l=NULL;

ただし、lは割り当てられておらず、その値がわからないため、変更するメモリの領域がわからないため、* l=NULLは未定義の動作です。

于 2013-02-19T11:58:30.237 に答える