0

stack2.h、stack2.c、main.c の 3 つのファイルがあります。

stack2.h には次のものが含まれます。

/* Define linked list structure */
typedef struct node {
    int val;
    struct Node *next;
} Node, *pNode;

/* Define stack structure */
typedef struct StackType {
    pNode top;
} Stack, *pStack;

/* Declare functions */
pStack InitStack( );

int IsEmpty( pStack pS );
int Pop( pStack pS );

void Push( pStack pS, int val );
void KillStack( pStack pS );

stack2.c が含まれています

pStack InitStack( ) {

    /* Declare variables */
    pStack pS = (pStack)malloc( sizeof(Stack) );

    /* Set first node to NULL */
    pS -> top = NULL;

    /* Return pointer to stack */
    return pS;

}

int IsEmpty( pStack pS ) {

    return ( pS->top == NULL );

}

int Pop( pStack pS ) {

    /* Declare variables */
    int ret = 0;
    pNode temp = NULL;

    /* Check if stack is empty */
   if( IsEmpty( pS ) ) {
        printf( "[ERROR] Pop operation on an empty stack.\n" );
        exit( 1 );
    }

    /* Find return value (last in) */
    ret = pS->top->val;
    temp = pS->top;

    /* Delete and kill node */
    pS->top = pS->top->next;
    free( temp );

    /* Return */
    return ret;

}

void Push( pStack pS, int val ) {

    /* Allocate memory for new node */
    pNode nnew = (pNode)malloc( sizeof(Node) );

    /* Initiate node */
    nnew->next = pS->top;
    nnew->val = val;

    /* Set structure's top to new node */
    pS -> top = nnew;

}

main.c に何が含まれているかについてあなたに負担をかけるつもりはありません。本質的に、これには正しいライブラリとファイルが含まれており、いくつかの値を単純にプッシュおよびポップします。次の警告が表示されます。

assignment from incompatible pointer types

これらの2行で:

    nnew->next = pS->top;
    pS->top = pS->top->next;

私は少し混乱しています。nnew はノードへのポインタなので、nnew->next もノードへのポインタです。pS はスタックへのポインタなので、pS->top もノードへのポインタです。これらがどのように互換性がないのかわかりません!

ここで何が起こっているのですか?ありがとう!

4

1 に答える 1

4
typedef struct node {
    int val;
    struct Node *next;
} Node, *pNode;

宣言しますstruct nodeが、その中で使用struct Node *します。C では大文字と小文字が区別されるため、ポインターは同じ型ではありません。structおそらく残念なことに、C では、逆参照しない限り、未知の型へのポインターを喜んで操作できます (これは「不透明なポインター」に使用されるイディオムです)。

于 2012-04-25T23:24:41.200 に答える