Elo wszystkim. Szukałem szukałem i już zgłupiałem. Pomóżcie.
Program ma dodawać na początek listy liczby podane przez użytkownika, na końcu użytkownik podaje liczbę, którą program ma usunąć z listy jeśli występuje takowa. Program działa, ale: Dla danych liczb: 1,2,3,4, oraz do usunięcia 4 program działa prawidłowo. Jednak jeśli chciałbym usunąć liczbę którą podałem jako pierwszą - program wysypuje się.
Druga sprawa to taka że program wczytuje liczby prawidłowo jednak nie robi tego na początek listy, a na koniec.
Jeśli jest ktoś na tyle życzliwy żeby znaleźć poprawki do funkcji to z góry wielkie dzięki :)
Kod:
#include<stdio.h>
#include<stdlib.h>
typedef struct element
{
int i;
struct element* Next;
} element;
typedef struct Lista
{
unsigned int Size;
element* First;
} Lista;
void ListInit(Lista* list)
{
if(!list)
return;
list->Size=0;
list->First=NULL;
}
int ListInsert(Lista* list,int a)
{
element* Tmp=NULL;
element* End=NULL;
element* New=NULL;
if(!list)
return -1;
Tmp=End=list->First;
while(Tmp)
{
if(Tmp->i==a)
break;
End=Tmp;
Tmp=Tmp->Next;
}
if(Tmp)
return -2;
New=(element*)malloc(sizeof(element));
if(!New)
return -3;
New->Next=NULL;
New->i=a;
++(list->Size);
if(!End)
{
list->First=New;
return 0;
}
End->Next=New;
return 0;
}
void ListClear(Lista* list, int a)
{
element* wsk=NULL;
wsk=list->First;
element* wsk2=NULL;
wsk2=list->First;
element* Tmp=NULL;
Tmp=list->First;
if (list->First==NULL) return;
if(Tmp->i==a)
{
Tmp=Tmp->Next;
free(wsk);
}
else
{
while((wsk->Next!=NULL)&&(wsk->Next->i!=a))
wsk=wsk->Next;
if(wsk->Next!=NULL)
{
wsk2=wsk->Next;
wsk->Next=wsk2->Next;
free(wsk2);
}
}
return;
}
void drukuj(Lista* n)
{
element* temp=NULL;
temp=n->First;
printf("%d ",temp->i);
do
{
temp=temp->Next;
printf("%d ",temp->i);
}while(temp->Next != NULL);
}
int main(void)
{
Lista lista1;
int x;
ListInit(&lista1);
scanf("%d",&x);
ListInsert(&lista1,x);
scanf("%d",&x);
ListInsert(&lista1,x);
scanf("%d",&x);
ListInsert(&lista1,x);
scanf("%d",&x);
ListInsert(&lista1,x);
scanf("%d",&x);
ListClear(&lista1,x);
drukuj(&lista1);
return 0;
}