Dinamik dizilerde ekleme ve silme işlemlerinin gerçekleştirilmesi #include <stdio.h> #include <stdlib.h> void yaz(int dizi[], int N); int main() { int i; int N = 5; int *dizi = (int*)malloc(N * sizeof(int)); dizi[0] = 5; dizi[1] = 2; dizi[2] = 3; dizi[3] = 8; dizi[4] = 4; int yeni = 111; // diziye eklemek istedigimiz eleman /** 1 - sona ekleme islemi */ N++; // dizinin boyutunu arttiriyoruz dizi = (int*)realloc(dizi, N * sizeof(int)); dizi[N-1] = yeni; // sona yeni elemani ekliyoruz printf("sona eklendiginde: "); yaz(dizi, N); // ekrana yaz /** 2 - sondan silme islemi */ N--; // dizinin boyutunu bir azaltiyoruz dizi = (int*)realloc(dizi, N * sizeof(int)); printf("sondan silindiginde: "); yaz(dizi, N); /** 3 - basa ekleme islemi */ N++; // dizinin boyutunu arttiriyoruz dizi = (int*)realloc(dizi, N * sizeof(int)); for (i = N-1 ; i > 0 ; i--) { dizi[i] = dizi[i-1]; // tum elemanlari bir ileri kaydiriyoruz } dizi[0] = yeni; // basa yeni elemani ekliyoruz printf("basa eklendiginde: "); yaz(dizi, N); /** 4 - bastan silme islemi */ for (i = 0 ; i < N-1 ; i++) { dizi[i] = dizi[i+1]; // tum elemanlari bir geri kaydiriyoruz } N--; // dizinin boyutunu eksiltiyoruz dizi = (int*)realloc(dizi, N * sizeof(int)); printf("bastan silindiginde: "); yaz(dizi, N); /** * basa ekleme ve silme islemi tum elemanlarin kaydirilmasina sebep oluyor. * bilgisayar 1000000 elemani rahatlikla saklayabilir. * hem basa hem sona eklerken, kaydirma islemi yapmadan eklemek icin farkli * bir veri yapisi kullanilmali (linked list). */ return 0; } void yaz(int dizi[], int N) { int i; for (i = 0 ; i < N ; i++) printf("%d ", dizi[i]); printf("\n"); } Bağlı listelere giriş #include <stdio.h> #include <stdlib.h> /** * liste olusturma mantigi * ornekte 5 6 7 sayilarini bagli liste mantigiyla pes pese ekliyoruz */ // kendini gosteren bir veri yapisi struct dugum { // bagli liste dugumu (elemani) int deger; struct dugum *sonraki; }; int main() { // ilk_sayi icin yer al struct dugum * ilk_sayi = (struct dugum*)malloc(sizeof(struct dugum)); ilk_sayi->deger = 5; // sayiyi ata // sonraki sayi icin yer al, adresi ilk sayinin icindeki degiskene ata ilk_sayi->sonraki = (struct dugum*)malloc(sizeof(struct dugum)); ilk_sayi->sonraki->deger = 6; // sonraki sayi icin yer al, adresi ikinci sayinin icindeki degiskene ata ilk_sayi->sonraki->sonraki = (struct dugum*)malloc(sizeof(struct dugum)); ilk_sayi->sonraki->sonraki->deger = 7; // 4. sayi yok, NULL isaretliyoruz ilk_sayi->sonraki->sonraki->sonraki = NULL; /* listedeki elemanlari yazmak */ printf("listedeki elemanlar:\n"); printf("ilk sayi: %d\n", ilk_sayi->deger); printf("ikinci sayi: %d\n", ilk_sayi->sonraki->deger); printf("ucuncu sayi: %d\n\n", ilk_sayi->sonraki->sonraki->deger); /* listedeki elemanlari dongude yazmak */ printf("listedeki elemanlar:\n"); struct dugum * sayi_ptr = ilk_sayi; while (sayi_ptr != NULL) { printf("%d\n", sayi_ptr->deger); sayi_ptr = sayi_ptr->sonraki; } return 0; } Bağlı listede ekleme ve yazdırma işlemleri #include <stdio.h> #include <stdlib.h> struct dugum { int sayi; struct dugum * sonraki; }; void listeyi_yaz(struct dugum *baslangic) { struct dugum *e; for (e = baslangic ; e != NULL ; e = e->sonraki) { printf("%d ", e->sayi); } printf("\n"); } int main() { // yeni eleman eklerken gecici olarak bu degiskeni kullanacagiz struct dugum *yeni; // listenin basini ve sonunu gosteren isaretciler struct dugum * bas = NULL; struct dugum * son = NULL; /** ilk elemani eklemek */ yeni = malloc(sizeof(struct dugum)); yeni->sayi = 40; // listede hic eleman yokken, yeni hem bas hem de son olur yeni->sonraki = NULL; // baska eleman olmadigi icin sonraki NULL bas = son = yeni; listeyi_yaz(bas); /** sona eleman eklemek */ yeni = malloc(sizeof(struct dugum)); yeni->sayi = 50; yeni->sonraki = NULL; // son eleman yapacagimiz icin sonraki NULL son->sonraki = yeni; // son elemanin sonrasina ekliyoruz son = yeni; // son isaretcisi artik yeni elemani gosteriyor listeyi_yaz(bas); /** basa eleman eklemek */ yeni = malloc(sizeof(struct dugum)); yeni->sayi = 10; yeni->sonraki = bas; // ilk eleman yapacagimiz icin sonraki eski ilk eleman bas = yeni; // bas isaretcisi artik yeni elemani gosteriyor listeyi_yaz(bas); return 0; } Fonksiyon kullanarak listeye ekleme işlemi #include <stdio.h> #include <stdlib.h> struct dugum { int sayi; struct dugum * sonraki; }; void sona_ekle(struct dugum **bas, struct dugum **son, int sayi) { struct dugum * yeni = malloc(sizeof(struct dugum)); yeni->sayi = sayi; if (*bas == NULL) { // listede eleman yoksa: ilk elemani ekleme islemini yapiyoruz yeni->sonraki = NULL; *bas = *son = yeni; } else { // listede eleman varsa: sona ekleme islemini yapiyoruz yeni->sonraki = NULL; // son eleman yapacagimiz icin sonraki NULL (*son)->sonraki = yeni; // son elemanin sonrasina ekliyoruz *son = yeni; // son isaretcisi artik yeni elemani gosteriyor } } void basa_ekle(struct dugum **bas, struct dugum **son, int sayi) { struct dugum * yeni = malloc(sizeof(struct dugum)); yeni->sayi = sayi; if (*bas == NULL) { // listede eleman yoksa: ilk elemani ekleme islemini yapiyoruz yeni->sonraki = NULL; *bas = *son = yeni; } else { // listede eleman varsa: basa ekleme islemini yapiyoruz yeni->sonraki = *bas; // ilk eleman yapacagimiz icin sonraki eski ilk eleman *bas = yeni; // bas isaretcisi artik yeni elemani gosteriyor } } int main() { // listenin basini ve sonunu gosteren isaretciler struct dugum * bas = NULL; struct dugum * son = NULL; // sona 111 ekle (ilk eleman, basa eklense de ayni) sona_ekle(&bas, &son, 111); // basa_ekle(&bas, &son, 111); listeyi_yaz(bas); // sona 150 ekle sona_ekle(&bas, &son, 150); listeyi_yaz(bas); // sona 200 ekle sona_ekle(&bas, &son, 200); listeyi_yaz(bas); // basa 100 ekle basa_ekle(&bas, &son, 100); listeyi_yaz(bas); // basa 500 ekle basa_ekle(&bas, &son, 500); listeyi_yaz(bas); return 0; } Baştaki elemanı silme işlemi #include <stdio.h> #include <stdlib.h> struct dugum { int sayi; struct dugum * sonraki; }; // NOT: asagidaki fonksiyonlarin kodlari onceki ornektedir void listeyi_yaz(struct dugum *baslangic); void sona_ekle(struct dugum **bas, struct dugum **son, int sayi); void basa_ekle(struct dugum **bas, struct dugum **son, int sayi); void ilk_elemani_sil(struct dugum **bas, struct dugum **son) { if (*bas == NULL) { // eleman yok, islem yapma } else if (*bas == *son) { // listede 1 tane eleman var free(*bas); // elemani sil *bas = *son = NULL; } else { // elemani gecici olarak bir isaretciyle goster struct dugum * silinecek = *bas; // silme islemini gerceklestir *bas = (*bas)->sonraki; free(silinecek); } } int main() { struct dugum * bas = NULL; struct dugum * son = NULL; sona_ekle(&bas, &son, 111); sona_ekle(&bas, &son, 150); sona_ekle(&bas, &son, 200); sona_ekle(&bas, &son, 250); sona_ekle(&bas, &son, 300); ilk_elemani_sil(&bas, &son); listeyi_yaz(bas); ilk_elemani_sil(&bas, &son); listeyi_yaz(bas); ilk_elemani_sil(&bas, &son); listeyi_yaz(bas); ilk_elemani_sil(&bas, &son); listeyi_yaz(bas); ilk_elemani_sil(&bas, &son); listeyi_yaz(bas); return 0; } Sondaki elemanı silme işlemi #include <stdio.h> #include <stdlib.h> struct dugum { int sayi; struct dugum * sonraki; }; // NOT: asagidaki fonksiyonlarin kodlari onceki ornektedir void listeyi_yaz(struct dugum *baslangic); void sona_ekle(struct dugum **bas, struct dugum **son, int sayi); void basa_ekle(struct dugum **bas, struct dugum **son, int sayi); void son_elemani_sil(struct dugum **bas, struct dugum **son) { if (*bas == NULL) { // eleman yok, islem yapma } else if (*bas == *son) { // listede 1 tane eleman var free(*bas); // elemani sil *bas = *son = NULL; } else { // sondan bir onceki elemani bul struct dugum *e = *bas; while (e != NULL && e->sonraki != *son) { e = e->sonraki; } // e = sondan onceki eleman free(e->sonraki); e->sonraki = NULL; *son=e; // NOT: yukaridaki donguyu olmadan silmek icin iki yonlu bagli liste kullanilmalidir } } int main() { struct dugum * bas = NULL; struct dugum * son = NULL; sona_ekle(&bas, &son, 111); sona_ekle(&bas, &son, 150); sona_ekle(&bas, &son, 200); sona_ekle(&bas, &son, 250); sona_ekle(&bas, &son, 300); son_elemani_sil(&bas, &son); listeyi_yaz(bas); son_elemani_sil(&bas, &son); listeyi_yaz(bas); son_elemani_sil(&bas, &son); listeyi_yaz(bas); son_elemani_sil(&bas, &son); listeyi_yaz(bas); son_elemani_sil(&bas, &son); listeyi_yaz(bas); return 0; }