Verkettete Listen / stacks
Tuesday, 7 July 2009
Beispielprogramm für verkettete Listen / stacks: Ein Programm, das beliebig viele Punkte einlesen und in einer verketteten Liste abspeichert. Beim Aufruf hat der Benutzer die Wahl neue Punkte einzugeben oder die bisherigen ausgeben zu lassen (in dem Fall werden sie auch aus dem stack gelöscht). Der stack soll/darf ausschließlich über die Funktionen pop() und push() bearbeitet werden.
/**
* Datei: pointStack.c
* Funktionen vom Stack Programm
*
* Rainer Hihn
*/
#include "pointStack.h"
/**
* globale Variable, die auf das
* oberste Element des Stacks zeigt
*/
STACK_POINT_PTR stackTop = NULL;
void push(POINT pushPoint)
{
/**
* temporaere Variable
*/
STACK_POINT_PTR stackPoint = (STACK_POINT_PTR) malloc(sizeof(STACK_POINT));
/**
* debugging
* printf("%d \n", stackPoint);
*/
/**
* Abbruchbedingung, falls zu wenig Speicher zur Verfuegung steht
*/
if(stackPoint == NULL)
{
printf("nicht genug Speicher zur Verfuegung ... Ende \n");
exit(1);
}
/*
* Punnkt speichern und
* stackTop auf den aktuellen Wert setzen
*/
stackPoint->p = pushPoint;
stackPoint->next = stackTop;
stackTop = stackPoint;
return;
}
POINT pop()
{
/**
* stackTop und nextStackTop
* zwischenspeichern
*/
STACK_POINT firstStackPoint = *stackTop;
/**
* Speicher vom obersten
* Stack-Element freigeben
*/
/**
* debugging
* printf("%d \n", stackTop);
*/
free(stackTop);
/**
* stackTop auf das ehemals
* zweite Element des Stacks setzen
*/
stackTop = firstStackPoint.next;
/**
* Punkte vom ehemals ersten Element
* zurueckgeben
*/
return firstStackPoint.p;
}
int isEmpty()
{
/**
* wenn next auf NULL zeigt
* dann ist dies das letzte Element
* des Stacks
* und es wird '1' zurueckgegeben
*/
if(stackTop == NULL)
{
return 1;
}
else {
return 0;
}
}
void printStackElement(POINT aPoint)
{
printf("Punkt x: %f, Punkt y: %f, Punkt z: %f \n", aPoint.rX, aPoint.rY, aPoint.rZ);
return;
}
/** * Datei: pointStack.h * Headerdatei fuer Stack Programm * * Rainer Hihn */ #include#include /* * structs */ /* * struct fuer die Koordinaten */ struct point { float rX; float rY; float rZ; }; typedef struct point POINT; struct stackPoint { POINT p; struct stackPoint *next; }; typedef struct stackPoint STACK_POINT; typedef STACK_POINT *STACK_POINT_PTR; /* * Funktionen */ void push(POINT pushPoint); POINT pop(); int isEmpty(); void printStackElement(POINT aPoint);
/***********************
* Datei: stackmain.c
* Speichern einer Menge von Punkten
*
* Rainer Hihn
*/
#include "pointStack.h"
void exit(int);
POINT readPoint()
{
POINT userPoint;
printf("Bitte x-Koordinate eingeben \n");
scanf("%62f", &userPoint.rX);
printf("Bitte y-Koordinate eingeben \n");
scanf("%62f", &userPoint.rY);
printf("Bitte z-Koordinate eingeben \n");
scanf("%62f", &userPoint.rZ);
return userPoint;
}
int main(void)
{
/**
* Variablendeklaration
*/
char cCmd;
printf("’p’ fuer Punkt eingeben, ’q’ fuer Ausgabe: \n");
while(1)
{
scanf("%c", &cCmd);
if(cCmd == 'p')
{
push(readPoint());
printf("’p’ fuer Punkt eingeben, ’q’ fuer Ausgabe: \n");
}
if(cCmd == 'q')
{
while(!isEmpty())
{
printStackElement(pop());
}
break;
}
}
return 0;
}