3

私はCでリストを書いています.以下はソースです:

#include <stdio.h>
#include <stdlib.h>


struct list {
 int value;
 struct list *next;
};

typedef struct list ls;



void add (ls **head, ls **tail, int val)
{
 ls *new, *tmp1, *tmp2;

 if (NULL == *head)
 {
    new = (ls*)malloc(sizeof(ls));
    *head = new;
    *tail = new;
    new->value = val;
    new->next = NULL;

    return;
 }

 else
 {
    tmp1 = *head;
    tmp2 = tmp1->next;
    while (tmp2 != NULL)
    {
        tmp1 = tmp2;
        tmp2 = tmp1->next;
    }

    new = (ls*)malloc(sizeof(ls));
    new->value = val;
    new->next = NULL;
    *tail = new;

    return;
 }
}



void show (ls **head, ls **tail)
{
 int i;
 ls *tmp;

 while (tmp->next != NULL)
 {
    printf("%d: %d", i,  tmp->value);
    i++;
    tmp=tmp->next;
 }

 return;
}



int main (int argc, char *argv[])
{
 ls *head;
 ls *tail;
 int n, x;

 head = (ls*)NULL;
 tail = (ls*)NULL;

 printf("\n1. add\n2. show\n3. exit\n");
 scanf("%d", &x);
 switch (x)
 {
    case 1:
        scanf("%d", &n);
        add(*head, *tail, n);
        break;

    case 2:
        show(*head, *tail);
        break;

    case 3:
        return 0;

    default:
        break;
}

 return 0;
}

gccでコンパイルすると

gcc -o lab5.out -Wall -pedantic lab5.c

奇妙なエラーが発生します:

lab5.c: In function ‘main’:
lab5.c:84:3: error: incompatible type for argument 1 of ‘add’
lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:84:3: error: incompatible type for argument 2 of ‘add’
lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:88:3: error: incompatible type for argument 1 of ‘show’
lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
lab5.c:88:3: error: incompatible type for argument 2 of ‘show’
lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’

私にとってはすべてがOKです...

そして、引数の型は、コンパイラが言うようではls**ありません。ls

誰かが間違っている可能性がありますか?

PS。引数として与える必要がないことはわかっており*tail、使用されていませんが、この「プログラム」を開発したいので、そうなるでしょう...

4

2 に答える 2

4

ダニエルが彼のコメントで言ったように、そしてcodaddictが彼の答えで言ったように、&代わりに使う*ことはあなたが望むものをあなたに与えるでしょう。ただし、覚えやすくするために、少し説明します。

* de-アタッチされているものを参照します。つまり、変数をポインターであるかのように受け取り、そのアドレスに値を与えます。

&参照を渡します。つまり、値が格納されているアドレスを渡します。つまり、変数へのポインタを渡します。

変数headとtailへのポインターを渡したいので、それらを&headandとして&tail渡します。これにより、値**head**tailもう一方の端が得られます。慣れるまでは直感に反しているようです。

于 2012-07-18T16:39:17.277 に答える
1
add(*head, *tail, n);

する必要があります:

add(&head, &tail, n);

ヘッドポインタとテールポインタのアドレスを関数に渡す必要があるためです。

show関数の呼び出しにも同様の修正が必要です。

于 2012-07-18T16:33:32.900 に答える