/************************************************************************ ** ** FILE : cellein.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "cellein.h" #include "celltype.h" #include /************************************************************************* ** FUNKTION: CellObEin ** ZWECK: Traegt einen Zeiger auf ein neues Objekt in eine Celle ein ** In Celle befindet sich bereits mind. 1 Objekt. ** INPUT: Celle und Zeiger auf Objekt ** OUTPUT: - ** ANMERK: Letztes Objekt in der Cellen-Liste ist eine "Kopie", ** genauer ein Zeiger auf ein Original, auf das auch andere ** Cellen verweisen koennen. ** Wird nun ein weiteres Objekt in die Liste eingetragen, ** muss das bis dahin letzte Element, also die Kopie, durch ** ein eigenstaendiges Original ersetzt werden, denn daran ** muss ja das neue Objekt angehaengt werden. *************************************************************************/ void CellObjEin( p, O) OBJECT **p; OBJECT *O; { OBJECT *AO; OBJECT *h; AO = (OBJECT *)malloc( sizeof( OBJECT)); AO->next = O; if ( !((*p)->next) ) { /* *p verweist auf letztes Element in */ AO->typ = (*p)->typ; /* Liste (die nur aus einem Element */ AO->Nr1 = (*p)->Nr1; /* besteht */ AO->Nr2 = (*p)->Nr2; *p = AO; } else { /* *p verweist auf ein Element, dem */ h = *p; /* noch mind 1 Element folgt */ while ( (h->next->next) ) h = h->next; AO->typ = h->next->typ; AO->Nr1 = h->next->Nr1; AO->Nr2 = h->next->Nr2; h->next = AO; } } /************************************************************************* ** FUNKTION: CellKEin ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void CellKEin( p, O) OBJECT **p; OBJECT *O; { OBJECT *AO; OBJECT *h, *h2; if ( !(*p) ) { *p = O; return; } if ( ((*p)->typ == CE_STELLE) && ((*p)->Nr1 == O->Nr1) ) return; if ( ((*p)->typ == CE_TRANSITION) && ((*p)->Nr1 == O->Nr2) ) return; if ( ((*p)->typ == O->typ) && ((*p)->Nr1 == O->Nr1) && ((*p)->Nr2 == O->Nr2) ) return; if ( !((*p) ->next) ) { /* *p verweist auf letztes Element in */ AO = (OBJECT *)malloc( sizeof( OBJECT)); AO->next = O; AO->typ = (*p)->typ; /* Liste (die nur aus einem Element */ AO->Nr1 = (*p)->Nr1; /* besteht */ AO->Nr2 = (*p)->Nr2; *p = AO; return; } else { /* *p verweist auf ein Element, dem */ h = *p; /* noch mind 1 Element folgt */ while ( (h->next->next) ) { h = h->next; if ( (h->typ == CE_STELLE) && (h->Nr1 == O->Nr1) ) return; if ( (h->typ == CE_TRANSITION) && (h->Nr1 == O->Nr2) ) return; if ( (h->typ == O->typ) && (h->Nr1 == O->Nr1) && (h->Nr2 == O->Nr2) ) return; } h2 = h->next; if ( (h2->typ == CE_STELLE) && (h2->Nr1 == O->Nr1) ) return; if ( (h2->typ == CE_TRANSITION) && (h2->Nr1 == O->Nr2) ) return; if ( (h2->typ == O->typ) && (h2->Nr1 == O->Nr1) && (h2->Nr2 == O->Nr2) ) return; AO = (OBJECT *)malloc( sizeof( OBJECT)); AO->next = O; AO->typ = h2->typ; AO->Nr1 = h2->Nr1; AO->Nr2 = h2->Nr2; h->next = AO; return; } }