Tek Bağlı Liste Uygulaması

Öğrencilere ait numara, ad, vize ve final bilgilerini tutan bir tek bağlı doğrusal liste uygulaması için:

 o Kayıt ekleme silme
 o Öğrencileri başarı notlarını hesaplayarak (Vize %40, Final %60) listeleme
 o Sınıfın en yüksek başarı notuna sahip öğrenci bilgilerini listeleme
 o Sınıfın başarı notu ortalamasını hesaplama

#include <stdio.h>
#include <stdlib.h>
 struct ogrenci{
  int no;
  char adi[40];
  int vize,final;
  struct ogrenci *sonraki;
 };
 typedef struct ogrenci dugum;
 dugum *head, *yenidugum, *oncekidugum,*enbasarili;

 void listeOlustur()
 {
     int n,k;
     printf("kac elemanli liste olusturacaksin?\n");
     scanf("%d",&n);
     for(k=0; k<n;k++)
     {
         if(k==0)
         {
             yenidugum=(dugum*)malloc(sizeof(dugum));
             head=yenidugum;
         }
         else
         {
             yenidugum->sonraki=(dugum*)malloc(sizeof(dugum));
             yenidugum=yenidugum->sonraki;
         }
         printf("ogrenci no:\n");
         scanf("%d",&yenidugum->no);

         printf("ogrenci Adi:\n");
         scanf("%s",yenidugum->adi);

         printf("ogrenci vize:\n");
         scanf("%d",&yenidugum->vize);

         printf("ogrenci final:\n");
         scanf("%d",&yenidugum->final);

     }
     yenidugum->sonraki=NULL;
 }
void ogrenciListele()
{
    double donemNotu=0;
    dugum *p;
    p=head;
    while(p!=NULL)
    {
        printf("\n************\n");
        printf("ogrenci no:%d\t",p->no);
        printf("ogrenci adi:%s\t",p->adi);
        printf("ogrenci vize:%d\t",p->vize);
        printf("ogrenci final:%d\t",p->final);
        donemNotu=p->vize*0.4+p->final*0.6;
        printf("donem  notu:%.2f\t",donemNotu);
        printf("\n**************\n");
        p=p->sonraki;
    }
}
void ogrenciEkle()
{
    int kayitNo;
    dugum *p,*q;
    yenidugum=(dugum*)malloc(sizeof(dugum));
     printf("ogrenci no:\n");
         scanf("%d",&yenidugum->no);

         printf("ogrenci Adi:\n");
         scanf("%s",yenidugum->adi);

         printf("ogrenci vize:\n");
         scanf("%d",&yenidugum->vize);

         printf("ogrenci final:\n");
         scanf("%d",&yenidugum->final);

         printf("hangi kayittan önce eklemek istiyorsunuz\n");
         printf("liste sonuna eklemek icin 0 giriniz");
         scanf("%d",&kayitNo);
         p=head;
         if(p->no==kayitNo)//basa ekle
         {
             yenidugum->sonraki=p;
             head=yenidugum;
         }
         else
         {
             while(p->sonraki!=NULL)
             {
                 q=p;
                 p=p->sonraki;
             if(p->no==kayitNo)//araya ekleme
                 {
                     q->sonraki=yenidugum;
                     yenidugum->sonraki=p;

                 }
                 else if(p->sonraki==NULL)
                 {
                     p->sonraki=yenidugum;
                     yenidugum->sonraki=NULL;
                 }
             }
         }

  }

void OgrenciSil()
{
    int kayitNo;
    dugum *p,*q;

    printf("silmek istediginiz ogrenci  no gir\n");
    scanf("%d",&kayitNo);

    p=head;
    if(p->no==kayitNo)//bastakini sil
    {
        head=p->sonraki;
        free(p);
    }
    else
    {
        while(p->sonraki!=NULL)
        {
            if(p->no==kayitNo)
                break;
            else
            {
                q=p;
                p=p->sonraki;
            }
        }
        if(p->no==kayitNo)//aradan silme
        {
            q->sonraki=p->sonraki;
            free(p);
        }
        else if(p->sonraki==NULL)
        {
            printf("silinecek ogrenci no yok\n");
        }
    }
}
double basariNotuHesapla(int vize,int final)
{
    return (0.4*vize)+(0.6*final);
}
void EnBasariliOgrenci()
{
    double basariNotu=0;
    dugum *p;
    p=head;
    enbasarili=head;
     while(p->sonraki!=NULL)
     {
         p=p->sonraki;
         if(basariNotuHesapla(p->vize,p->final)>basariNotuHesapla(enbasarili->vize,enbasarili->final))
            enbasarili=p;
     }
     printf("en basarili ogrenci :\n");
     printf("NO:%d -ADI:%s- BASARI NOTU:%.2f\n",enbasarili->no,enbasarili->adi,basariNotuHesapla(enbasarili->vize,enbasarili->final));
}

void sinifBasariortalamasi()
{
    double basariNotuOrtalamasi=0;
    double toplam=0;
    int sayac=0;
    dugum *p;
    p=head;
     if(p==NULL)
     {
         printf("listede kayit yok!!!");
     }
     else
     {
         do
         {
             toplam+=basariNotuHesapla(p->vize,p->final);
             p=p->sonraki;
             sayac++;
         }
          while(p!=NULL);
          {
              basariNotuOrtalamasi=toplam/sayac;
              printf("basari notu ortalamasi: %.2f",basariNotuOrtalamasi);
          }
     }
}
int main()
{
    int secim=0;
    printf("1-liste olustur\n"
           "2-yeni kayit ekle\n"
           "3-kayit sil\n"
           "4-en yuksek basari notu\n"
           "5-sinif ortalamasi\n");
           while(1)
           {
               printf("secim yap[1-5]:");
               scanf("%d",&secim);
               switch(secim)
               {
                   case 1:listeOlustur();
                   ogrenciListele();
                   break;
                    case 2:ogrenciEkle();
                   ogrenciListele();
                   break;

                    case 3:OgrenciSil();
                   ogrenciListele();
                   break;

                   case 4:EnBasariliOgrenci();
                  // ogrenciListele();
                   break;
                   case 5:sinifBasariortalamasi();
                   ogrenciListele();
                   break;

               }
           }
}

Yorumlar