Pomocy, błąd w kodzie - C - Lista jednokierunkowa

0

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;
}
1

Zapominasz że przy usuwaniu trzeba ewentualnie zmienić składowe obiektu Lista: First i Size

0

Okej. Rozumiem że składowe obiektu: Size(odpowiednio pomniejszać o 1), a First?

0

Nie czytając kodu. Odpowiedm tylko na ostatnie pytanie.

element *tmp = first->next;
free(first);
first = tmp;
0

Okej, problem rozwiązany. _13th_Dragon dzięki za pomoc!
A wiesz może jak przerobić zeby dodawało liczby na początek listy, a nie na koniec?

0
  1. Stwórz element.
  2. Ustaw jego wskażnik next na pierwszy element element (tmp->next = next)
  3. Ustaw wskażnik na początek listy na ten element który dodałeś ( first = tmp)

1 użytkowników online, w tym zalogowanych: 0, gości: 1