Strona 1 z 1

[c] Algorytm LIFO/FIFO

: 04 grudnia 2006, 18:59
autor: chyl-o
Kurcze mam sobie taki algorytm w C i coś nie bardzo chce mi zadziałać tak jak chcę:

Kod: Zaznacz cały

// LIFO


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

struct Wezel {
	int value;
	struct Wezel *next, *prev;
};

struct Stos {
	struct Wezel *top, *low;
};

void stos_new( struct Stos *s );
int push( struct Stos *s );
void pop( struct Stos *s, int val );
void stos_del( struct Stos *s );
//-------------------------------------------------
void main()
{
	struct Stos *stos = malloc( sizeof( struct Stos ));
	stos_new( stos );
		pop( stos, 1 );
		pop( stos, 12 );
		pop( stos, 13 );
		pop( stos, 14 );
		pop( stos, 15 );
		pop( stos, 16 );
	printf("\n");
	while( stos->top != 0 );
	{
		printf("%d   ", push( stos ) );
	}
	printf("\n");
	stos_del( stos );
}
//-------------------------------------------------
void stos_new( struct Stos *s ) {
	s->low = 0;
	s->top = 0;
}
//-------------------------------------------------
int push( struct Stos *s )
{
	int val = s->top->value;
	struct Wezel *stary = s->top;
	s->top = s->top->prev;
	free( stary );

	return val;
}
//-------------------------------------------------
void pop( struct Stos *s, int val )
{
	struct Wezel *nowy = malloc( sizeof( struct Wezel ) );
	nowy->value = val;
	if( s->top != 0 )
	{
		s->top->next = nowy;
		nowy->prev = s->top;
		
	}
	else
	{
		s->low = nowy;
		nowy->prev = 0;
	}
	s->top = nowy;
}
void stos_del( struct Stos *s )
{
	struct Wezel *temp;
	struct Wezel *check = s->top;
	while( check != 0 )
	{
		temp = check;
		check = s->top->prev;
		free( temp );
	}
	free( s );
}
nie bardzo wiem gdzie mam błąd, może ktoś wypatrzy go bo ja go nie widzę...

: 04 grudnia 2006, 22:48
autor: Lorenzo
Wiem, że to co zrobie nie jest zbyt pedagogiczne ;-)
Tutaj jest chyba lista jednokierunkowa (nie wiem czy lifo czy fifo).
Lista dwukierunkowa.

Mam nadzieje, że może coś oświeci. Możesz jeszcze spróbować dorwać jakąkolwiek ksiązke do C - te listy są wałkowane wszędzie ;-)

: 02 stycznia 2007, 17:54
autor: chyl-o
Dzisiaj przerobiłem cały algorytm i działa.

Kod: Zaznacz cały

// LIFO

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

struct Wezel {
	int wartosc;
	struct Wezel *pod, *nad;
};

struct Stos {
	struct Wezel *top, *low;
};

void NowyStos( struct Stos *PStos );
void Push( struct Stos *PStos, int val );
int Pop( struct Stos *PStos );
void Usun( struct Stos *PStos );

int main()
{
	struct Stos *lifo = malloc( sizeof( struct Stos ) );
	NowyStos( lifo );
		Push( lifo, 19 );
		Push( lifo, 20 );
		Push( lifo, 12 );
		Push( lifo, 90 );
		Push( lifo, 34 );
		Push( lifo, 0 );
	putchar('\n');
	while( lifo->top != 0 )
	{
		printf("%d   ", Pop( lifo ) );
	}
	Usun( lifo );
	putchar('\n');

	return 0;
}

void NowyStos( struct Stos *PStos )
{
	PStos->top = 0;
	PStos->low = 0;
}

void Push( struct Stos *PStos, int val )
{
	struct Wezel *nowy = malloc( sizeof( struct Wezel ) );
	nowy->wartosc = val;
	if( PStos->top != 0 )
	{
		PStos->top->nad = nowy;
		nowy->pod = PStos->top;
	}
	else
	{
		PStos->low = nowy;
	}
	PStos->top = nowy;
}

int Pop( struct Stos *PStos )
{
	struct Wezel *temp = PStos->top;
	int val = temp->wartosc;
	PStos->top = temp->pod;
	free( temp );

	return val;
}

void Usun( struct Stos *PStos )
{
	struct Wezel *temp;
	while( PStos->top != 0 )
	{
		temp = PStos->top;
		PStos->top = temp->pod;
		free( temp );
	}
	free( PStos );
}

: 02 stycznia 2007, 23:22
autor: chyl-o
A przy okazji naskrobalem algorytm FIFO, może się komuś przyda.

Kod: Zaznacz cały

// FIFO

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

struct Wezel {
	int wartosc;
	struct Wezel *pod, *nad;
};

struct Stos {
	struct Wezel *top, *low;
};

void NowyStos( struct Stos *PStos );
void Push( struct Stos *PStos, int val );
int Pop( struct Stos *PStos );
void Usun( struct Stos *PStos );

int main()
{
	struct Stos *fifo = malloc( sizeof( struct Stos ) );
	NowyStos( fifo );
		Push( fifo, 19 );
		Push( fifo, 76 );
		Push( fifo, 28 );
		Push( fifo, 101 );
		Push( fifo, 88 );
		Push( fifo, 3 );
	putchar('\n');
	while( fifo->low != 0 )
	{
		printf("%d   ", Pop( fifo ) );
	}
	Usun( fifo );
	putchar('\n');

	return 0;
}

void NowyStos( struct Stos *PStos )
{
	PStos->top = 0;
	PStos->low = 0;
}

void Push( struct Stos *PStos, int val )
{
	struct Wezel *nowy = malloc( sizeof( struct Wezel ) );
	nowy->wartosc = val;
	if( PStos->top != 0 )
	{
		PStos->top->nad = nowy;
		nowy->pod = PStos->top;
	}
	else
	{
		PStos->low = nowy;
	}
	PStos->top = nowy;
}

int Pop( struct Stos *PStos )
{
	struct Wezel *temp = PStos->low;
	int val = temp->wartosc;
	PStos->low = temp->nad;
	free( temp );

	return val;
}

void Usun( struct Stos *PStos )
{
	struct Wezel *temp;
	while( PStos->low != 0 )
	{
		temp = PStos->low;
		PStos->low = temp->nad;
		free( temp );
	}
	free( PStos );
}

: 12 stycznia 2007, 18:47
autor: DaViDeX
A nie lepiej skorzystać ze stack i queue z STL'a?

: 15 stycznia 2007, 08:15
autor: chyl-o
DaViDeX pisze:A nie lepiej skorzystać ze stack i queue z STL'a?
Takie rozwiązanie nie wchodziło w grę niestety.

: 06 stycznia 2008, 14:44
autor: siwki
macie moze gdzies kod programu w C na czterodziałaniowy kalkulator RPN wykorzystujący dynamiczną listę jednokierunkową ?? byłabym bardzo wdzięczny za udostępnienie

: 07 stycznia 2008, 00:36
autor: ponton
Chętnie taki napiszę za drobną opłatą. ;)

: 30 stycznia 2008, 19:18
autor: adam majewski
u mnie programy nie kończą się ( nieskończona pętla ) ,