Duplikaty w nowo stworzonej liście

0

Witam.

  1. Mam wczytaną listę ocen. Tutaj wszystko działa.
  2. Chcę stworzyć nową listę, która będzie zawierała imię, nazwisko i sumę punktów wszystkich studentów.
    Robię to za pomocą funkcji i przypisuje każdemu wartość 0 ( potem odpowiednio uzupełnię ). Jednak problem jest taki, że lista się tworzy i wyświetla, ale są na niej duplikaty ( powtarzają się Ci sami studenci ).
    Kod:
 struct Ocena{
	char nazwisko[17];
	char imie[15];
	int ocena; 
	int punkty;
	struct Ocena *next;
}
struct Ocena *head=NULL, *tail=NULL;

struct Student{
	char nazwisko[17];
	char imie[15];
	int sumaPunktow;
	struct Student *next;
}
struct Student *headS=NULL, *tailS=NULL;




void UtworzListeStudentow(){
	bool byl=false;
	struct Ocena *tmp, *ktory=NULL;
	struct Student  *tmpS=NULL, *tmpS2=NULL;
	char nazwisko[17];
	char imie[15];
	//TWORZY PIERWSZEGO STUDENTA
	strcpy(nazwisko, head->nazwisko);
	strcpy(imie, head->imie);
	
	tmpS=(struct Student*)malloc(sizeof(struct Student));
	strcpy(tmpS->nazwisko, nazwisko);
	strcpy(tmpS->imie, imie);
	tmpS->sumaPunktow=0;

	headS=tmpS;
	tailS=tmpS;
	tailS->nast=NULL;
	
	//DODAJE RESZTE STUDENTOW

	for(tmp=head; tmp; tmp=tmp->nast){	//przechodze przez liste wszystkich ocen
		for(tmpS2=headS; tmpS2; tmpS2=tmpS2->nast){	//przechodze przez liste wszystkich studentow, na poczatku jest tylko jeden
			if((strcmp(tmpS2->nazwisko, tmp->nazwisko)==0) && (strcmp(tmpS2->imie, tmp->imie)==0))	
				byl=true;	//to znaczy, że jest już na liście
			else{
				byl=false;	//to znaczy, że nie ma go na liście studentów
				ktory=tmp;			
			}
		}
		
		if(!byl){	//jeżeli nie wystąpił to trzeba dodać
			tmpS=(struct Student*)malloc(sizeof(struct Student));
			strcpy(tmpS->nazwisko, ktory->nazwisko);
			strcpy(tmpS->imie, ktory->imie);
			tmpS->sumaPunktow=0;

			tmpS->nast=NULL;
			tailS->nast=tmpS;
			tailS=tmpS;
			tailS->nast=NULL;
		}	
	}
}

int main(){
        //LISTA OCEN JEST WCZYTANA!
	struct Student *tmpS=NULL;
	UtworzListeStudentow();
	for(tmpS=headS; tmpS; tmpS=tmpS->next)
		printf("%s %s %d\n", tmpS->nazwisko, tmpS->imie, tmpS->sumaPunktow);

}
0
byl=false;
for(tmpS2=headS; tmpS2; tmpS2=tmpS2->nast)
  {
   if((strcmp(tmpS2->nazwisko, tmp->nazwisko)==0) && (strcmp(tmpS2->imie, tmp->imie)==0))
     {         
      byl=true;
      break;
     }
  }
if(byl) headS=pushStudent(headS,tmp->nazwisko,tmp->imie,tmp->punkty);
else tmpS2->punkty+=tmp->punkty;
0

Dzięki za odpowiedź, ale nie za bardzo to rozumiem. Mógłbyś napisać, w którym miejscu w moim kodzie jest błąd?
Robiłem tym samym algorytmem w innym projekcie i działało.

1
  1. Jeżeli student nie jest ostatnim to był będzie fałse
  2. ktory nie jest potrzebny bo to jest kopia tmp.
  3. Jeżeli student był na liście to nic nie robisz z punktami.
0
  1. Racja, wszystko dzieje się w 1 pętli, więc tmp nie przepada.
  2. Na razie tworzę listę, potem inną funkcją pododaję punkty odpowiednim studentom.

Wystarczyło dodać jedną linijkę, a właściwie samo break;:

  struct Ocena{
    char nazwisko[17];
    char imie[15];
    int ocena; 
    int punkty;
    struct Ocena *next;
}
struct Ocena *head=NULL, *tail=NULL;
 
struct Student{
    char nazwisko[17];
    char imie[15];
    int sumaPunktow;
    struct Student *next;
}
struct Student *headS=NULL, *tailS=NULL;
 
 
 
 
void UtworzListeStudentow(){
    bool byl=false;
    struct Ocena *tmp, *ktory=NULL;
    struct Student  *tmpS=NULL, *tmpS2=NULL;
    char nazwisko[17];
    char imie[15];
    //TWORZY PIERWSZEGO STUDENTA
    strcpy(nazwisko, head->nazwisko);
    strcpy(imie, head->imie);
 
    tmpS=(struct Student*)malloc(sizeof(struct Student));
    strcpy(tmpS->nazwisko, nazwisko);
    strcpy(tmpS->imie, imie);
    tmpS->sumaPunktow=0;
 
    headS=tmpS;
    tailS=tmpS;
    tailS->nast=NULL;
 
    //DODAJE RESZTE STUDENTOW
 
    for(tmp=head; tmp; tmp=tmp->nast){    //przechodze przez liste wszystkich ocen
        for(tmpS2=headS; tmpS2; tmpS2=tmpS2->nast){    //przechodze przez liste wszystkich studentow, na poczatku jest tylko jeden
            if((strcmp(tmpS2->nazwisko, tmp->nazwisko)==0) && (strcmp(tmpS2->imie, tmp->imie)==0)){    
                byl=true;    //to znaczy, że jest już na liście
                break;        //<-------------------------TEGO BREAK'A
            }
            else{
                byl=false;    //to znaczy, że nie ma go na liście studentów
                ktory=tmp;            
            }
        }
 
        if(!byl){    //jeżeli nie wystąpił to trzeba dodać
            tmpS=(struct Student*)malloc(sizeof(struct Student));
            strcpy(tmpS->nazwisko, ktory->nazwisko);
            strcpy(tmpS->imie, ktory->imie);
            tmpS->sumaPunktow=0;
 
            tmpS->nast=NULL;
            tailS->nast=tmpS;
            tailS=tmpS;
            tailS->nast=NULL;
        }    
    }
}
 
int main(){
        //LISTA OCEN JEST WCZYTANA!
    struct Student *tmpS=NULL;
    UtworzListeStudentow();
    for(tmpS=headS; tmpS; tmpS=tmpS->next)
        printf("%s %s %d\n", tmpS->nazwisko, tmpS->imie, tmpS->sumaPunktow);
 
}

Jeszcze raz dziękuję za pomoc. Jak kiedyś Ciebie spotkam to kupię flaszkę :P

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