#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Dairesel Liste Ornegi
struct Node {
    char name[30];
    int age;  // struct Node age; (?)
    struct Node *nextPtr; //  icinde yer aldigi blogun tipinde bir gösterici tanimlamasi.
} *firstPtr,*lastPtr,*tempPtr;  // Dairesel Listede lastPtr'nin islevi? Fazlalik?

void AddNode(char name1[], int number)
{
    //Fonksiyon iki kez kullanildiginda olusan iki dugumun arasindaki bagý saglayan komut dizisi NULL'a isaret ederken nasýl bag olusuyor?
    tempPtr=malloc(sizeof(struct Node)); // Node buyuklugunde bellekten ayrilan kismin adresini tempPtr'ye ata.
    strcpy(tempPtr->name,name1); // name1 degiskeninin icindeki degeri (*temPtr).name'e kopyala.
    tempPtr->age=number; // (*temPtr).age'e age1 degiskenini ata.
    tempPtr->nextPtr=NULL; // (*temPtr).(*nextPtr) ? (temPtr.(*nextPtr)) ? (*tempPtr).nextPtr   [(*tempPtr).nextPtr]

    if(firstPtr==NULL) {
        firstPtr=tempPtr; // firstPtr'ye tempPtr'nin icindeki adresi ata
        lastPtr=tempPtr;  // firstPtr'ye tempPtr'nin icindeki adresi ata
    }
    else {
        lastPtr->nextPtr=tempPtr;
        lastPtr=tempPtr;
    }
}

int length(struct Node *firstlistadr)
{
    int len=0;

    tempPtr=firstlistadr; //tempPtr’ye firstPtr’nin icindeki adres degerini ata.

    do{
        len++;
        tempPtr=tempPtr->nextPtr;

    } while(tempPtr != firstPtr); //tempPtr listenin basindaki dugumun adresini edinmedigi surece do-while dongusune devam.

    return len; //Listedeki dugum sayisini verir.
}

void DisplayList(void)
{
    tempPtr=firstPtr;

    while(1) {
        printf("Name> %s\nAge> %d\n",tempPtr->name,tempPtr->age);
        tempPtr=tempPtr->nextPtr;  // Ilk dugumden son dugume dogru *nexPtr araciligiyla temPtr'nin icindeki deger degismeli.
        if(tempPtr==firstPtr) break;  // temPtr'nin icindeki deger(adres) bir dairesel tur atip ilk dugumun adresini edindiginde while dongusunden cik.
    }
}

int main()
{
    firstPtr=NULL;
    lastPtr=NULL;
    char name1[30];
    int j,uz,age1;

    for(j=0;j<5;j++) {
        printf("Input name : ");
        scanf("%s",name1);

        printf("Input age : ");
        scanf("%d",&age1);

        AddNode(name1,age1);
    }
    DisplayList();
    uz=length(firstPtr);
    printf("length of the list = %d \n",uz);

    return 0;
}
