2017-01-30 2 views
1

это моя функция push, которая берет в стек и int параметры, превращает int в часть stackNode и возвращает новый стек с добавленным новым узлом (StackNode и Stack уже инициализированы правильно):Push Item to Stack with C

Stack push(Stack stk,int data){ 
    struct StackNode *top = stk.top; 
    struct StackNode *node; 
    node->data = data; 
    node->nextNode = top; 
    stk.top = node; 
    stk.count++; 
    return stk; 
} 

проблема, которую я имею, что каждый раз, когда я запустить функцию толчка, он более записывает другие элементы StackNode в стеке в качестве параметра я побежал.

Например:

push(stk, 3): stack output = 3 //good so far 
push (stk, 4): stack output= 4 4//the correct output would be 3 4! 
push(stk, 56): stack out put= 56 56 56 //what's going on! 

, что я делаю неправильно, пожалуйста, помогите

+2

использования [ 'станд :: стека <>'] (HTTP: // en.cppreference.com/w/cpp/container/stack); или, предоставить [mcve]. –

+3

@ Дан этот вопрос помечен C, а не C++ –

+1

@GovindParmar занял точку; хотя, может быть, я все еще покрыт «или ...» :-)? –

ответ

3

Вы не выделять память для узла. Добавьте выделение памяти.

Stack push(Stack stk,int data){ 
    struct StackNode *top = stk.top; 
    struct StackNode *node = malloc(sizeof(struct StackNode)); 

    node->data = data; 
    node->nextNode = top; 
    stk.top = node; 
    stk.count++; 

    return stk; 
} 

Или вы можете добавить проверку успешного распределения.

Stack push(Stack stk,int data){ 
    struct StackNode *top = stk.top; 
    struct StackNode *node = malloc(sizeof(struct StackNode)); 

    if (node != NULL) 
    { 
     node->data = data; 
     node->nextNode = top; 
     stk.top = node; 
     stk.count++; 
    } 

    return stk; 
} 

Я полагаю, что изначально элемент данных top объекта типа Stack был инициализирован NULL.

+0

Спасибо, что помогли мне! работа malloc работала! Не могли бы вы объяснить мне это? Мой профессор плохо учил его – ashadeka

+0

@ashadeka Вам нужно выделить узел, в котором вы собираетесь хранить значение переменных данных, а также ссылку на следующий узел. Список представляет собой цепочку узлов, соединенных указателями. –

-1

Я прочитал ваш код таким образом

struct StackNode *node; 
node->nextNode = stk.top; 
stk.top = node; 

это выглядит, как вы добавить узел, но ссылка на следующий всегда на себя.

Edit:

struct StackNode *top = stk.top; 
struct StackNode *node = malloc(sizeof(struct StackNode)); 
node->data = data; 
top->nextNode = node; 
stk.top = node; 
stk.count++; 
return stk; 

Edit2:

Sry забыть объяснить,

Вы писали

node->nextNode = top; 

, что я заменен

top->nextNode = node; 

Ваш код накладывает новый узел и ссылается на текущую верхнюю часть как на следующую, а затем делает новую верхнюю, что означает, что при вызове стека начальный узел был узлом, который вы надели на свой последний и обозначаемого к себе в качестве следующего узла, следовательно, этот вывод:

push(stk, 3): stack output = 3 //good so far 
push (stk, 4): stack output= 4 4//the correct output would be 3 4! 
push(stk, 56): stack out put= 56 56 56 //what's going on! 

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

+0

Спасибо, что помогли мне! работа malloc работала! Не могли бы вы объяснить мне это? Мой профессор плохо справился с обучением – ashadeka

+0

'top-> nextNode = node;': Уничтожить список. – BLUEPIXY

0

Это альтернативное решение: // Вы можете предположить, что вызов функции передает: адрес указателя на узел в верхней части стека и целое число. ион: например. толчок (& stackpointer, 5) // вставить узел со значением данных 5 на верхней части стека

void fun(StackNodePtr *topPtr, int info) 
{ 
    StackNodePtr *newPtr = malloc(sizeof(StackNode)); 


    if (newPtr != NULL) {   
     newPtr->data = info;   
    newPtr->nextPtr = *topPtr; 
     *topPtr = newPtr;    
    }      
    else { // no space available 
     printf("%d not inserted. No memory available.\n", info); 
    } 
} 

}

+0

Значит ли CoderGirl94, что вы девушка из 94-го кодера? :) –

+0

ты флиртуешь по моему вопросу – ashadeka