Tek Yönlü Bağlı Liste Fonksiyonları ( Ekleme, Silme, Arama, Listeleme )
Evet arkadaşlar bu yazımızda c programlama dili tek yönlü bağlı liste örneği (ekleme, silme, arama, listeleme ) yapacağız. Aslında daha önceki konularda tek yönlü bağlı liste fonksiyonlarını tek tek ekleme,silme vb. olarak paylaşmıştık. Bu kez tek bir kod üzerinde tüm fonksiyonları inceleyeceğiz. Öncelikle daha önce paylaşılan fonksiyonlara bakmak isteyenler olabilir aşağıdaki linklerden konulara ulaşabilirsiniz.
Ekleme Fonksiyonu : C Programlama Dili Tek Yönlü Bağlı Listede Ekleme
Silme Fonksiyonu : C Programlama Dili Tek Yönlü Bağlı Liste Silme Fonksiyonu
Listeleme Fonksiyonu : C Programlama Dili Bağlı Liste Tüm Elemanları Görüntüleme
Arama Fonksiyonu : C Programlama Dili Tek Yönlü Bağlı Listede Arama Yapma
Bu bağlantılardan tek tek fonksiyonlara bakarak da çalışabilirsiniz. Şimdi gelelim asıl konumuza, yani bu ayrı ayrı verdiğimiz fonksiyon kodlarını biraraya getirmeye. Öncelikle her veri yapısı konusunda olduğu gibi bu konuda da ilk olarak struct yapımızı oluşturuyoruz.
1
2
3
4
5
|
typedef struct list {
int sayi;
struct list *sonraki;
} liste;
liste *ilk = NULL, *son = NULL, *yeni, *silGecici, *gecici;
|
Görüldüğü gibi struct yapımız içerisinde bir tane integer “sayi” değişkeni ve struct list türünde bir pointer değişkeni bulunuyor. Altta ise liste ismini verdiğimiz struct türünden 5 farklı pointer değişkenleri oluşturuyoruz. Aşağıda ise kodumuzu kontrol edelim.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
#include<stdio.h>
#include<stdlib.h>
typedef struct list {
int sayi;
struct list *sonraki;
} liste;
liste *ilk = NULL, *son = NULL, *yeni, *silGecici, *gecici;
void menu();
void ekle();
void sil(int );
void listele();
void arama(int );
void ekranTemizle();
void bekle();
int main() {
while (1) {
menu();
}
return 0;
}
void ekle(int veri) {
yeni = (liste *) malloc(sizeof (liste));
yeni->sayi = veri;
yeni->sonraki = NULL;
if (ilk == NULL) { //İlk düğümde eleman olup olmadığını kontrol et.
ilk = yeni;
son = ilk;
} else { //İlk düğümde eleman varsa bu işlemleri yap.
son->sonraki = yeni;
son = son->sonraki;
}
}
void sil(int veri) {
int kontrol = 0;
if (ilk->sayi == veri) {
silGecici = ilk;
ilk = ilk->sonraki;
free(silGecici);
kontrol = 1;
} else {
gecici = ilk;
while (gecici->sonraki != NULL) { //gecici değişken ile liste üzerinde dolaşım sağlanır.
if (gecici->sonraki->sayi == veri) {
kontrol = 1;
silGecici = gecici->sonraki; //Silinecek düğüm sil adında değişkene atılır.
if (silGecici == son) //Silinecek düğüm son düğüm ise "son" un kaybolmaması için bir geriye atanır.
son = gecici;
gecici->sonraki = silGecici->sonraki; //Liste kaybolmasın diye aradaki bağ düzenlenir.
free(silGecici); //Sil düğümü bellekten silinir.
break;
}
gecici = gecici->sonraki;
}
}
if (kontrol == 0)
printf("Silmek Istediginiz Eleman Listede Yoktur...\n");
else
printf("%d sayisi listeden silinmiştir...\n", veri);
}
void listele() {
gecici = ilk;
while (gecici != NULL) {
printf("%d\n", gecici->sayi);
gecici = gecici->sonraki;
}
}
void arama(int aranan) {
int kontrol = 0;
gecici = ilk;
while (gecici != NULL) {
if (aranan == gecici->sayi) {
kontrol = 1;
}
gecici = gecici->sonraki;
}
if (kontrol == 1)
printf("\n%d Sayisi Bulunmustur..\n", aranan);
else
printf("\nAranan Sayi Bulunamamistir...\n");
}
void menu() {
int secim, sayi;
printf("1-Ekleme\n");
printf("2-Listeleme\n");
printf("3-Arama\n");
printf("4-Silme\n");
printf("5-Cikis\n");
printf("Lutfen Secim Yapiniz --> ");
scanf("%d", &secim);
switch (secim) {
case 1:
ekranTemizle();
printf("Sayi Giriniz: ");
scanf("%d", &sayi);
ekle(sayi);
printf("%d sayisi listeye eklendi\n",sayi);
bekle();
break;
case 2:
ekranTemizle();
if (ilk == NULL) {
printf("Liste Bostur. Lutfen eleman ekledikten sonra listeleme yapiniz..\n");
bekle();
break;
}
listele();
bekle();
break;
case 3:
ekranTemizle();
if (ilk == NULL) {
printf("Liste Bostur. Lutfen eleman ekledikten sonra arama yapiniz..\n");
bekle();
break;
}
printf("Sayi Giriniz: ");
scanf("%d", &sayi);
arama(sayi);
bekle();
break;
case 4:
ekranTemizle();
if (ilk == NULL) {
printf("Liste Bostur. Lutfen eleman ekledikten sonra silme yapiniz..\n");
bekle();
break;
}
printf("Sayi Giriniz: ");
scanf("%d", &sayi);
sil(sayi);
bekle();
break;
case 5:
ekranTemizle();
printf("Program Bitti!\n");
exit(0);
break;
default:
ekranTemizle();
printf("Hatali Secim\n");
bekle();
}
}
void ekranTemizle() {
//Windows icin
system("cls");
//Linux icin
//system("clear");
}
void bekle() {
char temp;
printf("Devam etmek icin Enter'a basiniz!\n");
//klavyeden okuma atlamasinin onune gecmek icin 2 kere yazildi
temp = getchar();
temp = getchar();
ekranTemizle();
}
|
Ekran Çıktısı 1 :
1
2
3
4
5
6
|
1-Ekleme
2-Listeleme
3-Arama
4-Silme
5-Cikis
Lutfen Secim Yapiniz -->
|
Ekran Çıktısı 2 :
1
2
3
|
Sayi Giriniz: 12
12 sayisi listeye eklenmistir...
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 3 :
1
2
3
4
|
Listeleme yapiliyor..
12
25
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 4 :
1
2
|
Liste Bostur. Lutfen eleman ekledikten sonra arama yapiniz..
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 5 :
1
2
3
4
|
Aramak istediginiz Sayiyi Giriniz: 65
65 Sayisi Bulunmustur..
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 6 :
1
2
3
4
|
Aramak istediginiz Sayiyi Giriniz: 85
Aranan Sayi Bulunamamistir...
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 7 :
1
2
|
Liste Bostur. Lutfen eleman ekledikten sonra silme yapiniz..
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 8 :
1
2
3
|
Silmak istediginiz Sayiyi Giriniz: 22
22 sayisi listeden silinmiştir...
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 9 :
1
2
3
|
Silmek istediginiz Sayiyi Giriniz: 88
Silmek Istediginiz Eleman Listede Yoktur...
Devam etmek icin Enter'a basiniz!
|
Ekran Çıktısı 10 :
1
2
3
4
5
|
menüden 5 seçimini yaptığımız da ise ekrana;
"Program Bitti!"
çıktısını vermektedir.
|
Bu şekilde tek yönlü bağlı liste fonksiyonlarımızı bitirmiş oluyoruz. Menüden tüm seçim kombinasyonlarının da ekran çıktıları da yukarıda tek tek verilmiştir. Daha fazla kod örnekleri için bizi takip etmeye devam edin…