Dinamik dizilerde ekleme ve silme işlemlerinin gerçekleştirilmesi

advertisement
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;
}
Download