2014-11-03 4 views
0

Мой кодпечати элементы стека

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

struct node { 
    char ch; 
    struct node *next; 
}; 
struct node *first,*top1,*newptr; 

void push_back(char data) { //Pushes data into the stack 
    if (first == NULL) { 
     first = new node(); 
     first->next = NULL; 
     first->ch = data; 
    } 

    else { 
     first = new node(); 
     top1->next = first; 
     top1->ch = data; 
     first = top1; 
    } 
} 

void display() { 
    top1 = first; 

    if (top1 == NULL){ 
     printf("Stack is empty"); 
     return; 
    } 

    while (top1 != NULL){ 
     printf("%c ", top1->ch); 
     top1 = top1->next; 
    } 
} 


main() { 
    first = NULL; 
    char EXP[100]; 

    scanf("%s",&EXP); 
    system("cls"); 
    int len = strlen(EXP); 

    for(int i=0;i<len;i++) 
     push_back(EXP[i]); 

    display(); 

    system("pause"); 
} 

Моя программа должна получить строку пользователя, а затем каждый символ будет помещен в стек, и я бы напечатать строку назад. Когда я запускаю свой код, он мог отображать только первый символ. Я что-то упускаю?

+1

Этот код не является C. У вас в нем 'новый'. И все же каким-то образом ваш компилятор справляется с тем, чтобы не отклонять 'main()' без возвращаемого значения. Кстати, 'scanf ("% s ", &EXP);' является неопределенным поведением, потому что они несовместимые типы. –

+0

но он должен был получить строку от пользователя, что несовместимо с этим? –

+0

Просто удалите амперсанд. –

ответ

3

Когда вы push_back() во второй раз, вы сразу же перезаписать first

else { 
    first = new node(); //oops 
    top1->next = first; 
    top1->ch = data; 
    first = top1; 

теряет данные, которые он указал ранее.

+0

ОК, я уже удалил его, но теперь есть программная ошибка :( –

1

Проблема в том, что top1 неинициализирован, поэтому ваша программа имеет неопределенное поведение. Вы, скорее всего, сделали опечатку, где first должна быть top1:

void push_back(char data) { //Pushes data into the stack 
    // ... 
    else { 
     top1 = new node(); 
     top1->next = first; 
     top1->ch = data; 
     first = top1; 
    } 
+0

теперь он работал спасибо :) –

0

Есть ошибки в вашей функции push_back, а также функции дисплея. Вы должны построить прочную базу в указателях и распределении памяти, прежде чем переходить на стопки и связанные списки. Я рекомендую эту статью: http://cslibrary.stanford.edu/102/PointersAndMemory.pdf
Прежде всего, как упоминалось выше, top1 должен быть вашим новым узлом, а не первым. сначала это всего лишь указатель на вершину вашего стека. Надеюсь, вы позаботились об этом. Приступая к вашей функции отображения, вы повторяете свой верхний элемент, то есть сначала это не имеет смысла, поскольку указывает на значение NULL, а стек создается сверху вниз, а не наоборот. Вы должны сохранить указатель на нижнюю часть стека. Вот рабочий код:

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

struct node { 
    char ch; 
    struct node *next; 
}; 
struct node *first,*top1,*newptr,*stackbottom; 

void push_back(char data) { //Pushes data into the stack 
    if (first == NULL) { 
     first = new node(); 
     first->next = NULL; 
     first->ch = data; 
     stackbottom=first; 
    } 

    else { 
     top1 = new node(); 
     top1->ch = data;  
     first->next = top1; 
     first=top1; 
    } 
} 

void display(){ 
    //top1 = first; 
    struct node *curr; 
    curr=stackbottom; 
    if (stackbottom == NULL){ 
     printf("Stack is empty"); 
     return; 
    } 

    while (curr != NULL){ 
     printf("%c ", curr->ch); 
     curr = curr->next; 
    } 
} 


main() { 
    first = NULL; 
    char EXP[100]; 

    scanf("%s",EXP); 

    //system("cls"); 
    int len = strlen(EXP); 

    for(int i=0;i<len;i++) 
     push_back(EXP[i]); 
    //printf("%c",stackbottom->ch); 
     //push_back(EXP[1]); 

    display(); 

    //system("pause"); 
} 
Смежные вопросы