2012-05-17 2 views
2

У меня возникли проблемы с реализацией стека, используя связанный список со структурой. Программа компилируется отлично, но когда я запускаю ее, она печатает первый элемент, а затем читает следующий узел как NULL. Я думаю, что это может быть ошибка с моим прохождением стека к методу нажимной, но я не уверен, и я не был успешным в установлении его, поэтому я прошу вашей помощи:реализация стека со связанным списком в C

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

Любая помощь быть оцененным.

Благодаря

ответ

2

несколько проблем, я мог видеть:

1) printStack(&stack); должны быть printStack(stackPtr);, как вы передаете адрес stackPtr функции нажимной.

2)

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

должно быть:

node = malloc(sizeof(StackNode)); 

3)

push(stackPtr, 'a'); 

должно быть:

push(&stackPtr, 'a'); 

Как вам нужно передать адрес верхнего указателя.

+1

Большое спасибо, гораздо больше проблем, чем я понял, но исправлен теперь благодаря вам. – nain33

+0

Нет я в стеке или переполнении :) – Jay

1

Это неверно:

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

, как это только выделение памяти для struct stackNode* (обычно 4 байта для любого типа указателя), когда он должен быть выделения памяти в течение struct stackNode (по крайней мере, 5 байт) :

node = malloc(sizeof(StackNode)); 

-

См Do I cast the result of malloc?

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

Как этот ответ на вопрос? – mpromonet

+1

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – JAL

Смежные вопросы