2

構造体でリンクされたリストを使用してスタックを実装するのに問題があります。プログラムは正常にコンパイルされますが、実行すると最初の要素が出力されますが、次のノードが NULL として読み取られます。スタックを push メソッドに渡す際にエラーが発生した可能性があると思いますが、確信が持てず、修正に成功していないため、あなたの助けを求めています:

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

struct stackNode{
    char data;
    struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;

void convertToPostfix(char infix[], char postfix[]);
int isOperator(char c);
int precedence(char operator1, char operator2);
void push(StackNodePtr *topPtr, char value);
char pop(StackNodePtr *topPtr);
char stackTop(StackNodePtr topPtr);
int isEmpty(StackNodePtr topPtr);
void printStack(StackNodePtr topPtr);

int main(){
    convertToPostfix(NULL, NULL);
    return 0;
}

void convertToPostfix(char infix[], char postfix[]){
    StackNode stack = {'(', NULL};
    StackNodePtr stackPtr = &stack;
    push(stackPtr, 'a');

    //printf("%s\n", stackPtr->data);
    printStack(&stack);
}

void push(StackNodePtr *topPtr, char value){
        StackNode *node;
        node=(StackNodePtr)malloc(sizeof(StackNodePtr));

        node->data=value;
        node->nextPtr=*topPtr;
        *topPtr=node;
}

void printStack(StackNodePtr topPtr){
    if(topPtr == NULL){
        printf("%s\n", "NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
        return;
    }

    printf("%c\n", topPtr->data);
    printStack(topPtr->nextPtr);
}

どんな助けでも大歓迎です。

ありがとう

4

3 に答える 3

2

私が見ることができたいくつかの問題:

1)のアドレスをpush関数に渡すときと同じである必要がありprintStack(&stack);ます。printStack(stackPtr);stackPtr

2)

node = (StackNodePtr)malloc(sizeof(StackNodePtr));

する必要があります:

node = malloc(sizeof(StackNode));

3)

push(stackPtr, 'a');

する必要があります:

push(&stackPtr, 'a');

トップポインタのアドレスを渡す必要があるため。

于 2012-05-17T10:17:33.677 に答える
1

これは正しくありません:

node=(StackNodePtr)malloc(sizeof(StackNodePtr));

a (少なくとも 5 バイト) にstruct stackNode*メモリを割り当てる必要がある場合に、a (通常はすべてのポインター型に 4 バイト) にのみメモリを割り当てているため:struct stackNode

node = malloc(sizeof(StackNode));

--

malloc の結果をキャストしますか? を参照してください。

于 2012-05-17T10:27:21.167 に答える
0
#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node * link;
};

void push(struct node **, int);
int pop(struct node **);
void display(struct node *);
void printMenu();

int main() {
    struct node * p;
    p = NULL;
    int data, ch, data1;
    //char choice[10];
    do {
        printMenu();

        printf("Enter your choice\n");
        scanf("%d", &ch);
        switch (ch) {
        case 1:
            printf("Enter the element to be pushed\n");
            scanf("%d", &data);
            push(&p, data);
            break;
        case 2:
            data1 = pop(&p);
            if (data1 != -1000)
                printf("The popped element is %d\n", data1);
            break;
        case 3:
            printf("The contents of the stack are");
            display(p);
            printf("\n");
            break;
        default:
            return 0;
        }
    } while (1);
    return 0;
}

void printMenu() {
    printf("Choice 1 : Push\n");
    printf("Choice 2 : Pop\n");
    printf("Choice 3 : Display\n");
    printf("Any other choice : Exit\n");
}

void push(struct node **q, int num) {
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
    temp->link = (*q);
    temp->data = num;
    (*q) = temp;
}


void display(struct node *q) {
    //Fill in the code here
    struct node *temp = q;
    if (temp == NULL)
        printf(" {}");
    while (temp != NULL)
    {
        printf(" %d", temp->data);
        temp = temp->link;
    }
}

int pop(struct node **q) {
    //Fill in the code here
    struct node *temp;
    int item;
    if (*q == NULL)
    {
        printf("Stack is empty\n");
        return -1000;
    }
    temp = *q;
    item = temp->data;
    *q = (*q)->link;
    free(temp);
    return item;
}
于 2015-10-02T17:44:44.623 に答える