Witam,
W pierwszej kolejności to tak jak kolega drobok napisał podaj strukturę.
Dalej: pierwszy if
if(strcmp(nowy->numer,temp->numer)==0)
return 0;
jest niepotrzebny tym samym else też jest niepotrzebne. Po co sprawdzać oddzielnie pierwszy element na liście (temp = glowa) jak za chwile i tak w petli sprawdzasz to drugi raz. Teraz kolejna rzecz: pokaż fragment odpowiedzialny za budowanie listy. Bo mam dziwne wrażenie, że wędrujesz nie w tą stronę po liście. Co to jest za lista jedno- czy dwu- -kierunkowa? Jeżeli jednokierunkowa to jak inicjujesz pole (wskaźnik poprzedni). Wydaje mi się, że w pętli do-while robisz błąd myślowy. Jeżeli temp pokazuje na pierwszy element listy (glowa) to wskaźnik glowa->poprzedni a) albo powinien być pusty = NULL b) albo pokazywać na ostatni element listy (jeżeli na liście jest tylko jeden element to to też będzie NULL). Jeżeli moje podejrzenie jest słuszne (bez funkcji wstawiającej ciężko zgadywać) to: a) następuje podstawienie
temp = temp->poprzedni
czyli temp = NULL b) próbujesz zrobić porównanie
if(strcmp(nowy->numer,temp->numer)==0)
czyli
if(strcmp(nowy->numer,NULL->numer)==0)
a to jest nieładne i prawdopodobnie tu się składa. Ja bym to przerobił tak:
int sprawdz(komputer *nowy,komputer *glowa)
{
komputer *temp = glowa;
if (temp == NULL) //lista pusta
{
return 0;
}
bool na_liscie = false;
do//jezeli tu doszlo to lista ma min 1 element
{
na_liscie = (strcmp(nowy->numer,temp->numer) == 0);
temp=temp->poprzedni; //dopiero po sprawdzeniu przechodzimy na ewentualny następny element listy
}while(!na_liscie)&&(temp->poprzedni!=NULL)); //trzeba sprawdzic wszystkie z listy a nie tylko jeden jak to robiła Twoja funkcja; bedzie sprawdzac wszystkie, albo do momentu znalezienia na liscie
int porownanie = (na_liscie ? 0 : 1);
return porownanie
}
Dlaczego Twoja funkcja sprawdzała tylko jeden? Zapewniał to Twój warunek w do-while
if(strcmp(nowy->numer,temp->numer)==0) //sprawdz jeden (drugi, bo przed chwilą temp przesunął się o jeden)
return 0; //drugi jest taki sam (logicznie spoko)
else
return 1; // drugi nie jest taki sam (a co z resztą listy?) return powoduje wyjście z funkcji przed zakończenie do-while
Napisane z pamięci, więc jeżeli coś, gdzieś pominąłem to przepraszam, ale idea jest oddana.
A nie lepiej, żeby funkcja zwracała bool (true/false) zamiast 0/1? Poza tym zwracaj uwagę na długość wprowadzanych danych do tablic znaków, żebyś nie pisał po pamięci, bo też się będzie wywalać.
Powodzenia