C
else if((strcmp(liste->name,cha->name)>=0)&&(strcmp(liste->name,(cha->nnach)->name)<0))
{
(cha->nnach)->nvor=liste;
liste->nnach=cha->nnach;
liste->nvor=cha; /* !!!!!! */
cha->nnach=liste;
pruef=1;
}
da war das problem. bzgl. des null pointers muss ich mich korrigieren, es war schon korrekt so, wie du es hattest; nur schwer verständlich.
hier mal wie ich es machen würde als anregung:
struct LISTE *sortiere(struct LISTE *ein, int *anz, char einname[],int einjahr,float einpreis)
{
/* ich gehe davon aus, das ein auf den anfang der liste zeigt bzw. NULL ist
andernfalls müsste man entweder erst den anfang der liste suchen oder
in abhängigkeit des elements, auf das ein zeigt, die liste von dort
ausgehend vorwärts oder rückwärts durchsuchen */
struct LISTE *neu;
struct LISTE *prev=NULL; /* Zeiger auf das vorherige Element, also next->prev */
struct LISTE *next=ein;
neu=(struct LISTE *)malloc(sizeof(struct LISTE));
if(neu==NULL)
{
printf("Speicher konnte nicht bereitgestellt werden!\n\n");
}
else
{
strcpy(ein->name,einname);
neu->jahr=einjahr;
neu->preis=einpreis;
/* die liste liegt sortiert vor, beginnend mit dem kleinsten element;
wir suchen solange, bis wir das erste element, das grösser als das
neue ist, gefunden haben, oder wir das ende der liste erreicht
haben (next==NULL) */
while( next!=NULL && strcmp(neu->name,next->name)>=0 )
{
prev = next;
next = next->nnach;
}
/* jetzt den nnach pointer von neu initialisieren, und den rückwärtsgericheteten
pointer von next auf neu, sofern next!=NULL */
neu->nnach = next;
if( next != NULL ) next->nvor = neu;
/* analog für nvor und prev, falls prev NULL ist, muss zusätzlich
ein auf neu gesetzt werden, damit das funktionsergebnis der anfang
der liste ist (und so auch der fall ein==NULL korrekt behandelt wird) */
neu->nvor = prev;
if( prev != NULL ) prev->nnach = neu; else ein = neu;
}
return ein;
}