2016-03-28 12 views
0

Nerede yanlış gittiğimi anlamaya çalışıyorum. Ekleme yöntemim, aynı öğrencinin iki kez eklendiğini algılamıyor. P.s listesi konteynerin başına işaret ediyor.C++ Yöntem mantığı ekle

int add(Student* s) 
{ 
    Container *follow = list; 

    Container *newNode = new Container; 
    newNode->student = s; 


    if (list == NULL) 
    { 
     newNode->next = NULL; 
     list = newNode; 
     //cout << "Student Added!"; 
     return 1; 

    } 
    else if (s->getFirstName().compare(list->student->getFirstName()) == 0) //duplication check 
    { 
     if (s->getLastName().compare(list->student->getLastName()) == 0) //Same Student 
     { 
      free(newNode->student); //Memory Mangment 
      free(newNode); 
      // cout << "Student Exist!"; 
      return 0; 
     } 
    } 
    else //adding at the beginning of the list 
    { 
     newNode->next = list; 
     list = newNode; 
     // cout << "Student Added!"; 
     return 1; 
    } 

    Container* temp = list->next; 

    while (temp != NULL) // inserting inbetween 2 nodes in the list 
    { 
     if (s->getFirstName().compare(list->student->getFirstName()) == 0) 
     { 
      if (s->getLastName().compare(list->student->getLastName()) == 0) //Same Student 
      { 
       free(newNode->student); //Memory Mangment 
       free(newNode); 
       // cout << "Student Exist!"; 
       return 0; 
      } 
     } 
     else 
     { 
      newNode->next = list; 
      list = newNode; 
      // cout << "Student Added!"; 
      return 1; 
     } 
     follow = temp; 
     temp = temp->next; 
    } 
    follow->next = newNode; // inserting at the end of the list 
    return 1; 


} 

Kodu şu şekilde değiştirdim, ancak hala bir çalışma zamanı hatası alıyorum.

Container* follow = list; 
Container* newNode = (Container*) malloc(sizeof(Container)); 
newNode->student = s; 
newNode->next = NULL; 

if (list == NULL) // inserting into an empty list 
{ 
    list = newNode; 
    return 1; 
} 

while (list != NULL) 
{ 
    if (search(s) == NULL) 
    { 
     newNode->next = list; 
     list = newNode; 
     return 1; 
    } 
    else if (search(s) != NULL) 
    { 
     free(newNode->student); //Memory Mangment 
     free(newNode); 
     // cout << "Student Exist!"; 
     return 0; 
    } 


} 

Aşağıda bu fonksiyon zaten sizin için uygulanır // arama uygulanmasıdır. İstenen öğrenci listede yoksa, NULL döndürülür.

Student* search(Student* s) 
    { 
    Container *traverser = list; 

while (traverser != NULL) 
{ 
    if (traverser->student->getFirstName() == s->getFirstName() && traverser->student->getLastName() == s->getLastName()) 
     return traverser->student; 
    traverser = traverser->next; 
} 
return NULL; 
} 
+0

Re '_CONTAINER_H_', altçizgi ile başlayan ve büyük harfle başlayan tanımlayıcıların uygulamaya ayrıldığını lütfen unutmayın. –

+0

"Karşılaştır" yerine, std :: string 'için' == 'kullanabilirsiniz. –

+0

C++ 11 yerine, 'NULL' yerine, genel tercih 'nullptr 'kullanımı içindir:' null 'olsaydı bile niçin kullanıldığını, niçin bu olduğunu açıkladı. –

cevap

0

while döngü mantığı yeni öğrencinin ilk isim mevcut birinci düğümünde ilk adı farklıysa, o zaman sadece takın olduğunu, diğer şeyler arasında, diyor.

+0

İki ifade birlikte bir araya getirdim – SUser

0

while döngüsünüz aşağıdakileri yapıyordur: - Eğer öğrencinin ilk adı döngünün ilk elemanından farklıysa -> öğrenci 'u ekleyin - eğer adın adı aynıysa ve soyadı aynıysa -> 'dan çık - eğer ilk isim aynıysa ve soyadı farklıysa -> sonraki öğeye git.

Bu, listenin ilk öğesinde, eklemek istediğiniz öğrenciden farklı bir ada sahip olduğunda, listenin içeriğinden bağımsız olarak öğrencinin ekleneceği anlamına gelir.

Örnek: Şu anki site: [Ben benson, jack jackson, john johnson] Eklenme: jack jackson. İlk kontrol "ben" in "jack" a eşit olmadığını ve "jack jackson" eklemeye devam edeceğini görecektir.

Çözüm: - Öğrencinin bulunduğu yere veya listenin sonuna ulaşana kadar listenin öğelerini tek tek kontrol edin. (bu sizin while döngüsünüz olacaktır.) - while döngüsünden sonra, öğrenci bulunamadıysa, öğrenciyi ekleyin.