Lista dwukierunkowa - usuwanie elementu

0
#define ROZT 30
#define ROZT_2 15


typedef struct osoba
{
	char nazwisko[ROZT];
	char imie[ROZT_2];
	int rok;
	int miesiac;
	int dzien;
	int telefon;
	struct osoba *nxt, *prev;
} psymbol;

typedef psymbol *ppsymbol;

ppsymbol sym_end = NULL;
ppsymbol sym_beg = NULL;
void UstawWKolejnosci(ppsymbol tmp)
{
	//ppsymbol wsk, wsk1;
	if (tmp->prev==NULL)
		return;
	else
	{
		ppsymbol wsk, wsk1, wsk2;
		wsk=tmp->prev;
		wsk1=tmp;
		if((strcmp (tmp->nazwisko, wsk->nazwisko)>0))
			return;
		while ((strcmp (tmp->nazwisko, wsk->nazwisko))<=0)
		{
			wsk=wsk->prev;
			if(wsk==NULL)
				break;
		}
		if (wsk==NULL)
		{
			wsk2=tmp->prev;
			wsk2->nxt=NULL;
			sym_end=wsk2;
			wsk=wsk->nxt;
			wsk->prev=tmp;
			tmp->nxt=wsk;
			tmp->prev=NULL;
			sym_beg=tmp;
			return;
		}
		wsk=wsk->nxt;
		wsk1=wsk->nxt;
		while ((strcmp (tmp->nazwisko, wsk->nazwisko)==0))
			wsk1=wsk1->nxt;
		while ((strcmp (tmp->imie, wsk->imie))>0)
			wsk=wsk->nxt;
		if(wsk==wsk1)
		{
			wsk=wsk->prev;
			wsk=wsk->prev;
			wsk->nxt=tmp;
			tmp->prev=wsk;
			wsk1->prev=tmp;
			tmp->nxt=wsk1;
		}
		else
		{
			wsk=wsk1;
			wsk=wsk->prev;
			wsk=wsk->prev;
			wsk->nxt=tmp;
			tmp->prev=wsk;
			wsk1->prev=tmp;
			tmp->nxt=wsk1;
		}
		wsk2=tmp->prev;
		wsk2->nxt=NULL;
		sym_end=wsk2;
	}
}

Witam,
mam problem z ową funkcją której zadaniem ma być przeniesienie elementu z końca listy w odpowiednie dla niej miejsce (gdyż lista ma być sortowana wg nazwisk i imion)
brak jakichkolwiek błędów, jej mała modyfikacja (rozpatrywana dla przypadku gdy lista jest 1 lub 2 elementowa działa, ale rozbudowana wersja zawiera jakiś błąd, którego nie jestem w stanie pojąc, gdyż rozpisywałem sobie to działanie i teoretycznie wydaje mi się, iż powinna być w porządku.
Pozdrawiam

poprawienie tytułu wątku + dodanie znaczników <code class="c"> - fp

0

Nie dodawaj tego na koniec zaś dodaj to od razu w odpowiednie miejsce.
Jeżeli cała funkcja nie zamknie się w 10 wierszy wywalaj i zaczynaj od początku.

0

Nie widzę żadnych szans żeby to się miało w 10 wierszach zmiescic gdyż najpierw musze porownac nazwiska i znalezc to za ktorym mam wstawiac a potem tak samo przy imionach gdzie nazwisko jest takie same. Udało mi się skrócić kod stosując się do tego że mam nie wstawiać na koniec ale i tak cos nie działa.

void DodajOsobe(void)
{
	ppsymbol tmp, wsk, wsk1;
	if ((tmp = (ppsymbol)malloc(sizeof(psymbol))) != NULL)
	{
		PobierzDane(tmp);
		if (SprawdzDane(tmp)==1) {
			printf("Blednie wprowadzone dane");
			free(tmp);
			return;
		}
		if(sym_beg->nxt==NULL) {
			tmp->prev = sym_end;
			tmp->nxt = NULL;
			sym_end = tmp;
			sym_beg = tmp;
		}
		else
		{
		wsk=sym_beg;
		while ((strcmp (tmp->nazwisko, wsk->nazwisko))>=0 && wsk!=NULL) //
				wsk=wsk->nxt; 									 
		if(wsk==NULL)
		{
			wsk1=sym_end;
			wsk1->nxt=tmp;
			tmp->prev=wsk1;
			tmp->nxt=NULL;
			sym_end=tmp;
		}
		//wsk1=wsk;
		wsk=wsk->prev;
		while ((strcmp (tmp->nazwisko, wsk->nazwisko))==0 && (strcmp (tmp->imie, wsk->imie))<0)
				wsk=wsk->prev;			
		tmp->nxt=wsk->nxt;
		wsk->nxt=tmp;
		tmp->prev=wsk;
		wsk1=tmp->nxt;
		wsk1->prev=tmp;
		}
	}
}

dodanie znacznika <code class="c"> - fp

0
int compare(ppsymbol a,ppsymbol b)
  {
   int v=strcmp(a->nazwisko,b->nazwisko);
   return v?v:strcmp(a->imie,b->imie);
  }

void DodajOsobe(ppsymbol data) // data już wprowadzone, sprawdzone, wypełnione
  {
   ppsymbol next,prev;
   for(next=sym_beg,prev=0;(next)&&(compare(next,data)>0);next=prev->nxt) prev=next;
   data->prev=prev;
   data->nxt=next;
   //if(prev) prev->nxt=data; else sym_beg=data; // specjalnie dla Furious Programming zamieniam dwa wiersze na jeden i bez warunku
   //if(next) next->prev=data; else sym_end=data; // specjalnie dla Furious Programming zamieniam dwa wiersze na jeden i bez warunku
   (prev?prev->nxt:sym_beg)=(next?next->prev:sym_end)=data; 
  }
0

Dzięki wielkie za pomoc :D
Co prawda nie wiem czy to ze względu na mój program czy na jakiś mały błąd w kodzie tu nie można dodać więcej niż 2 elementy (tzn. tak jakby są zapisane ale nie tak jak powinny do w prostym wypisywaniu wypisuje tylko 2) no ale mam nadzieje że dojdę do tego.

Taki mały offtopic - czy tak się na, że tak to nazwę "wyższym poziomie kodowania" pisze programy jak Twój kod wygląda?

0

Taki mały offtopic - czy tak się na, że tak to nazwę "wyższym poziomie kodowania" pisze programy jak Twój kod wygląda?

Tak się pisze zobfuskowany kod żeby był krótki i nie wiadomo do czego :D

0

http://ideone.com/YicbbA
Dodaje się bez problemu dowolna ilość elementów.
Co do takiego kodowania, ilość błędów odwrotnie proporcjonalna umiejętności programisty oraz wprost proporcjonalna ilości wierszy.
Pisząc bardzo krótko podwyższam za każdym razem swoje umiejętności oraz obniżam szanse popełnienia błędu.

Niektóry (w większości to osoby słabo znające język) uważają (i tak robią) że należy rozpisywać wszystko w jak największej ilości wierszy.
W wyniku czego nie podnoszą swoich umiejętności oraz zwiększają szanse na popełnienie błędu.

Sam decyduj co jest ważniejsze dla ciebie.

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