Circular Linked List (C)

Dairesel Bağlı Liste

Circular Linked Listlerin Single Linked Listten tek farkı son elemanın başlangıç pointerini (head) işaret etmesidir (normalde son elemanın next pointeri NULL gösteriyordu. Açıkçası bundan başka single linked listten çok fazla bir farkı olmamasına rağmen yine de aşağıda kodları paylaşıyorum.

 struct n{
           int x;
           struct n * next;
       };
       typedef struct n node;
     
       node* eklesirali(node *r, int x){
           if(r==NULL){ // henüz linked listte hiç eleman yoksa (boşsa)
               r = (node*)malloc(sizeof(node)); // bir eleman yarat
               r->next = r; // tek elemanlı dairesel liste olduğu için kendini gösterttik
               r->x = x; // parametre olarak alınan x değerini data kısmına yazıyor (data x bu kodda)
               return r;
           }
           if(r->x > x ){  // ekleyeceğimiz eleman ilk elemandan küçükse
                           // root değişiyor
               node * temp = (node*)malloc(sizeof(node));
               temp->x = x;
               temp-> next = r;
               node * iter = r;
               while (iter->next != r) {
                   iter = iter->next;
               }
               iter->next = temp;
               return temp; // 
           }
           node * iter = r; 
           while (iter->next != r &&  iter->next->x < x) { // diğer durumlar için
               iter = iter->next;
           }
           node * temp = (node*)malloc(sizeof(node));
           temp->next = iter->next;
           iter ->next = temp;
           temp->x = x;
           return r;
           
           
       }
node* sil(node* r, int x){
    node* temp;
    node* iter = r;
    if (r->x == x) { // eğer ilk elemanı sileceksek
        while (iter->next != r) {
            iter = iter->next;
        }
        iter->next = r->next;
        free(r);
        return iter->next;
    }
    while (iter->next != r && iter->next->x != x) { // parametre alınan x değerinden farklı iken dön
        iter = iter->next;  // iteri ilerlet
        
    }
    if (iter->next == r) { // eğer son elemana kadar silenecek eleman bulunamadıysa..
        printf("sayi bulunamadi \n");
        return r;
    }
    temp = iter->next; // temp silmek istediğimiz düğümü iter ise ondan bir önceki düğümü gösterecek
    iter->next = iter->next->next;
    free(temp);
    return r;
}
  void bastir(node *r){
           node* iter = r; // iter roottan başlıyor
           printf("%d",iter->x);
           iter = iter->next;   
           while (iter != r) { 
               printf("%d ",iter->x);
               iter = iter->next;
           }
           printf("\n");
       }
    

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir