Witam,
Chciałbym zaimplementować w ISOC99 strukturę działającą tak jak Stack<int> z STL (nie chodzi mi o dokładną kopię, ale o praktyczny kontener) wykorzystując bibliotekę standardową. Robię to by porządnie nauczyć się C.
Planuje, by stos który utworzę był wskaźnikiem, następnie wskaźnik ten podawać jako argument funkcji obsługującej stos, dzięki temu będę miał podobny efekt jakbym wykonywał metodę na obiekcie, którym jest przekazywany argument. Planuję zastosować listę jednokierunkową.
Mam problem z operacją push. Ponieważ jest to stos nowy, zaalokowany węzeł jest wstawiany na koniec listy. W nowo wstawionym wskaźnik na ostatnim elemencie jest ustawiony na NULL. W momencie wstawiania wskaźnik na koniec stosu ma zmieniać adres elementu ->next z NULL na adres nowego węzła. Problem w tym, ze informacja ta nie jest zapamiętywana.
#include<stdio.h>
#include<stdlib.h>
#include "stack.h"
int main()
{
stackroot* root = NULL;
stackint* top = NULL;
printf("top address before malloc %d\n", top);
if( initialize_stack(&root, &top) == -1) {
fprintf(stderr, "Cannot create stack!\n");
exit(1);
}
printf("top address %d\n", top);
push(root, &top, 2);
printf("After in program: %d\n", top);
push(root, &top, 3);
printf("After in program: %d\n", top);
push(root, &top, 7);
printf("After in program: %d\n", top);
push(root, &top, 9);
printf("After in program: %d\n", top);
printf("Last element: %d\n", top->value);
printf("ilosc elementow: %d\n", size(root));
return 0;
}
#ifndef STACK_H
#define STACK_H
typedef struct stackint {
struct stackint* next;
int value;
} stackint;
typedef struct stackroot {
struct stackint* first;
int size;
} stackroot;
#define STACKSIZE sizeof(stackint)
#define ROOTSIZE sizeof(stackroot)
int initialize_stack(stackroot** root, stackint** top);
int size(stackroot* root);
int push(stackroot* root, stackint** stack, int value);
#endif /* STACK_H */
#include<stdlib.h>
#include<stdio.h>
#include "stack.h"
int initialize_stack(stackroot** root, stackint** top)
{
if( (*root = malloc(ROOTSIZE)) == NULL ) {
fprintf(stderr, "Cannot allocate memory!\n");
return -1;
}
if( (*top = malloc(STACKSIZE)) == NULL ) {
fprintf(stderr, "Cannot allocate memory!\n");
return -1;
}
//set number of elements in empty stack
(*root)->size = 0;
// connect root with top node
(*root)->first = *top;
return 1;
}
int push(stackroot* root, stackint** stack, int value)
{
stackint* stackNode = NULL;
if( (stackNode = malloc(STACKSIZE)) == NULL ) {
fprintf(stderr, "Cannot allocate memory!\n");
return -1;
}
// set value in node
stackNode->value = value;
stackNode->next = NULL;
// put in the end
if(root->size == 0)
root->first = stackNode;
else {
// set top's next as node
// there seems not to remember
printf("Before: %d\n", (*stack)->next);
(*stack)->next = stackNode;
printf("After: %d\n", (*stack)->next);
}
// increase size
++(root->size);
// return value > 0
return 1;
}
int size(stackroot* root)
{
return root->size;
}
Podejrzewam, że problemem jest kwestia kopiowania argumentu, a nie przekazywania przez wskaźnik. Jednoczesnie mam problem z poprawieniem tego.
Wyjscie:
top address before malloc 0
top address 16760880
After in program: 16760880
Before: 0
After: 16760944
After in program: 16760880
Before: 16760944
After: 16760976
After in program: 16760880
Before: 16760976
After: 16761008
After in program: 16760880
Last element: 0
ilosc elementow: 4
Pozdrawiam i dziekuje za podpowiedzi,