#include<stdio.h>
#include<stdlib.h>struct node{
int data;
struct node * next;
};
// ilk dugumumuz
struct node * head=NULL;void addDataToHead(int data){
struct node * temp,*ptr;
ptr=(struct node *) malloc(sizeof(struct node));
ptr->data=data;
if(head == NULL){
// artik ilk dugum ekledigimiz dugum olacak eger ki liste boş ise
head=ptr;
head->next=NULL;
}else{
// ilk elemanımızı gecici pointerimiza atiyoruz cunku bu artik 2.eleman olacak
temp=head;
// ilk elemanımız artık yeni ekledigimiz eleman ptr olacak
head=ptr;
// artık yeni eklediğimiz elemanın next'i gecici yani bizim önceki head'imiz olacak.
ptr->next=temp;
}}
void addData(int data){
// temp gecici node ilerde kullanacagimiz , ptr ise eklenecek eleman
struct node * temp,*ptr;
// bellekten yerimizi ayırıyoruz
ptr=(struct node *) malloc(sizeof(struct node));
// datamizi yeni ekleyeceğimiz elemana aktariyoruz
ptr->data=data;
// head NULL yani eleman hiç yok ise yeni eklenen elemani atiyoruz
if(head == NULL){
head=ptr;
head->next=NULL;
}
// eğer ki eleman varsa
else{
temp=head;
// en son düğümü buluyoruz
while(temp->next!=NULL){
temp=temp->next;
}
// son eleman yeni eklenen eleman ptr'ı gösterecek
temp->next=ptr;
// ptr son eleman olduğu için NULL gösterecek.
ptr->next=NULL;
}
}void addToLocation(int locationData,int data){
struct node *temp,*ptr;
// bellekte yer ayırıyoruz
ptr=(struct node *) malloc (sizeof(struct node));
// datamızı aktarıyoruz
ptr->data=data;
// eğer ki ilk baştaki elemanın data'sından önce eklenecekse başa eleman eklemek oluyor o yüzden addDataToHead çağrıldı
if(head!=NULL && head->data == locationData){
addDataToHead(data);
}else{
// temp'e ilk düğümü attık
temp=head;
// artık ilk düğümden sonraki diğer düğümlerin datasını kontrol ediyoruz.Eşit olana kadar dön
while(temp->next->data != locationData){
temp=temp->next;
}
// ekleyeceğimiz elemanın next'i de temp ile bulunan elemandan hemen sonraki elemanı gösterir çünkü araya ekledik.
ptr->next=temp->next;
// bulunan eleman ekleyeceğimiz elemandan önce olacağı için next'i de ptr'ı gösterir
temp->next=ptr;
}
}
void removeHeadData()
{
struct node *temp;if(head==NULL){
printf("Linked list bos!!");
}else{
// baş düğümünden sonraki gelen düğüm artık ilk düğüm olacağı için sonraki düğümü(2.sıradaki düğüm 1.sıraya geçecek) ikinci düğümü geçici düğüme at
temp=head->next;
// ilk düğümü uçur/çıkar bellekten
free(head);
// artık ilk eleman geçiçi düğümdeki 2.düğüm olacak head'e ata
head=temp;
}
}void removeLastData(){
struct node * temp;
if(head==NULL){
printf("Linked list bos!!");
}
// ilk düğümümüz boş değilse gir
else{
// 2.düğümümüz null değilse gir
if(head->next!=NULL){
// baştaki düğümü geçici oluşturduğumuz düğüme at
temp=head;
// biz sondan önceki elemanı bulmak için aşağıdaki while conditionunu yazdık
while(temp->next->next!=NULL){
temp=temp->next;
}
// sondan önceki elemanı temp değişkenine üstte while döngüsü içinde bulup atadık , aşağıda ise onu bellekten uçuruyoruz yerini boşaltıyoruz
free(temp->next);
// artık sondan önceki elemanımız son eleman olacağı için next'i de NULL gösterir.
temp->next=NULL;
}else{
// eğer ki 2.düğümümüz NULL yani boş ise , yoksa ilk tek bir eleman vardır onu da yukarıda yazdığımız fonksiyonu çağırarak uçuruyoruz :D
removeHeadData();
}
}
}void removeDataFromLocation(int data){
struct node *temp,*ptr;
if(head==NULL){
printf("Linked list is empty");
}else{
// baştaki düğümü geçici düğüme atadık
temp=head;
if(temp->data==data){
removeHeadData();
}else{
// temp'in önündeki düğümün datası verilen dataya eşit olmadığı sürece döngüye eşit olana kadar gir
while(temp->next->data!=data){
temp=temp->next;
}
// ptr bizim temp'ten sonraki bulduğumuz düğümden sonraki düğümü alır ve bu düğüm silinecek düğümden sonraki düğümdür
ptr=temp->next->next;
// bulunan düğümü uçuruyoruz
free(temp->next);
// artık temp'in nexti bizim bellekten sildiğimiz düğümden sonraki düğümü gösterir
temp->next=ptr;
}
}
}
void reverse(){
struct node *temp,*temp2=NULL,*prev=NULL;
if(head == NULL){
printf("List bos!!");
}
else{
temp=head; // 15
while(temp!=NULL){
temp2=temp->next;
temp->next=prev;
prev=temp;
temp=temp2;
}
head=prev;
}}
void count(){
struct node * temp=head;
int adet = 0;
while(temp->next!=NULL){
adet++;
temp=temp->next;
}
adet++;
printf("\nAdet : %d\n",adet);}
void sum(){
struct node *temp=head;
int toplam=0;
while(temp->next!=NULL){
toplam+=temp->data;
temp=temp->next;
}
toplam+=temp->data;
printf("\nToplam: %d\n",toplam);
}
void display(){
struct node *temp;
if(head == NULL){
printf("List bos!!");
}
else{
temp=head;
printf("\n");
while(temp->next!=NULL){
printf("%d\t",temp->data);
temp=temp->next;
}
printf("%d",temp->data);
}}
int main(){
int choice,data,location;
while(1){
printf("\n1)Sona Ekle\n2)Basa Ekle\n3)Araya Eleman Ekle\n4)Bastan Eleman Sil\n5)Sondan Eleman Sil\n6)Locationdan Eleman Sil\n7)Dugumleri Ters Cevir\n8)Eleman Sayisi\n9)Verilerin Toplami\n10)Verileri Goruntule\nSeciminizi giriniz : ");
scanf("%d",&choice);
switch(choice){
case 1: printf("Data degerini giriniz : ");scanf("%d",&data);addData(data);break;
case 2: printf("Data degerini giriniz : ");scanf("%d",&data);addDataToHead(data);break;
case 3: printf("Hangi elemandan önce : ");scanf("%d",&location);printf("Datayi giriniz : ");scanf("%d",&data);addToLocation(location,data);break;
case 4: removeHeadData();break;
case 5: removeLastData();break;
case 6: printf("Silinecek data : ");scanf("%d",&location);removeDataFromLocation(location);break;
case 7: reverse();break;
case 8: count();break;
case 9: sum();break;
case 10: display();break;
}
}
return 0;
}