Video: C Programlama Bağlı Listeler 2024
C programlamada, zaten oluşturduğunuz koda ikinci bir yapı eklemek isterseniz, birbirine işaretçiler içeren bir dizi yapı olan bağlantılı bir liste oluşturun. Bir yapıdaki temel verilerle birlikte yapı, listedeki bir sonraki yapının adresini içeren bir işaretçi içerir.
Bazı akıllı hileli işaretçi isimleriyle birlikte, listenin sonuna bir boşluk bırakırsanız, İlkel Bağlantılı Liste Örneğinde kaynak koduna benzeyen bir sonuç almanız mümkündür.
ÖNCELİKLİ BİRLEŞTİRİLMİŞ ÖRNEK
#include #include #include int main () {stok stok {char symbol [5]; int miktarı; yüzer fiyat; struct stock * bir sonraki;}; yapısal hisse senedi * ilk; yapı stok * akım; yapısal hisse senedi * yeni; / * Bellekte yapı oluştur * / ilk = (struct stock *) malloc (sizeof (struct stock))); if (first == NULL) {puts ("Bir çeşit malloc () hatası"); exit (1);} / * Yapı verisine atama * / current = first; strcpy (şimdiki - sembol, "GOOG"); akım> miktarı = 100; akım> fiyat = 801. 19; akım> aşağıdaki = NULL; yeni = (yapı stok *) malloc (sizeof (yapı stok)); if (new == NULL) {puts ("Başka malloc () hatası"); exit (1);} current-> next = new; = Yeni akım; strcpy (şimdiki -> sembol, "MSFT"); akım> miktarı = 100; akım> fiyat = 28. 77; akım> aşağıdaki = NULL; / * Veritabanı görüntüle * / koyar ("Yatırım Portföyü"); Printf ("SymboltSharestPricetValuen"); birinci akım =; printf ("% -% 6st% 5dt% 2ft%. 2fn", akım-> sembol, akım-> miktar, akım-> fiyat, akım-> miktar * akım-> fiyat); akım = akım> aşağıdaki; printf ("% -% 6st% 5dt% 2ft%. 2fn", akım-> sembol, akım-> miktar, akım-> fiyat, akım-> miktar * akım-> fiyat); return (0);}
Bu kaynak kodu oldukça uzun, ancak ilki ile bağlantılı ikinci bir yapı oluşturuyor. Kaynak kodun boyunun sizi korkutmasına izin verme.
13'ten 15'e kadar olan satırlar, bağlantılı liste dansı için gerekli olan standart üç yapı işaretçisini beyan eder. Geleneksel olarak, bunlar önce, güncel ve yeni seçilir. Yapıdaki dördüncü üyeye, ardından bir yapı işaretçisi olan Satır 11'de buldular.
Bağlantılı bir liste oluştururken yeni bir yapı değişkeni tanımlamak için typedef'i kullanmayın. Primitive Linked List Örneği, typedef'i kullanmaz, bu nedenle kodla ilgili bir sorun değil, ancak birçok C programcısı, typedef'i yapılarla birlikte kullanıyor. Dikkatli ol!
Line 15'te kullanılan değişken adı new, C ++'da ayrılmış bir kelimedir, bu nedenle iki dilli olmasını istiyorsanız, değişken adını new_struct veya yeni kelime dışındaki bir şeye değiştirin.
İlk yapı doldurulduğunda, Satır 30 bir sonraki öğeye bir NULL işaretçisi atar.Bu NULL değeri bağlantılı listenin sonlarını kapar.
Satır 32, adresini yeni işaretçi değişkene yerleştiren bir yapı oluşturur. Adres, Satır 38'deki ilk yapıya kaydedilir. İkinci yapının konumu bu şekilde korunur.
40'dan 43'e kadar olan satırlar, 43. satırdaki bir sonraki öğeye bir BOş değer atanarak ikinci işaretçi için bilgi doldurur.
Bağlar yapıların içeriği görüntülendiğinde gerçekleşir. Satır 48, ilk yapının adresini yakalar. Ardından 54 nolu çizgi, bir sonraki yapının adresini ilk yapıdan yakalar.
Alıştırma 1 : İlkel Bağlantılı Liste Örneği kaynak kodunu düzenleyiciye yazın. Uzun olsa da, daha sonradan düzenlemeniz gerekeceği için yazın (şimdiye kadar buna alışkın değilseniz). Kurun ve çalıştırın.
Dizilerden farklı olarak, bağlantılı bir listedeki yapılar numaralandırılmamıştır. Bunun yerine, her yapı listedeki bir sonraki yapıya bağlanır. İlk yapının adresini bildiğiniz sürece, NULL ile işaretlenmiş sonuna kadar listede çalışabilirsiniz.
İlkel Bağlantılı Liste Örneği, çok sayıda tekrarlanan kod içeren bazı özensiz kaynak kodlarını gösterir. Kodunuzda bunun gibi birden fazla ifade gördüğünüzde, hemen "işlevleri" düşünmelisiniz. "
DAHA İYİ BİRLEŞTİRİLMİŞ LİSTE ÖRNEK
#include #include #include #define ITEMS 5 yapı stoku {char symbol [5]; int miktarı; yüzer fiyat; struct stock * bir sonraki;}; yapısal hisse senedi * ilk; yapı stok * akım; yapısal hisse senedi * yeni; struct stock * make_structure (void); void fill_structure (struct stock * a, int c); void show_structure (yapı stok * a); int main () {int x; / * Görüntülenen veritabanı * / puts ("Yatırım Portföyü"); printf ("SymboltSharestPricetValuen (" Yatırım Portföyü "); "); struct hisse * make_structure (void) {struct hisse senedi * a; a (struct hisse senedi *);) void fill_structure (struct stock * a (); void fill_structure (struct hisse * a); void fill_structure (struct hisse * a);, int c) printf ("Stok simgesi:"); scanf ("% s", a-> sembol); printf ("Sayı scanf ("% f", & a-> fiyata);} void show_structure (struct stock * a) hisse senedi sayısı: "scanf ("% d ", & a-> miktar); printfsembol, a-> miktar, a-> fiyat, a-> miktar * a-> fiyat);}
En bağlantılı listeler A Better Linked-List Example'de gösterildiği gibi oluşturulmuştur Anahtar, 13-15 arasındaki satırlarda gösterilen üç yapı değişkenini kullanmaktır:
-
önce her zaman adresini listesindeki ilk yapının Her zaman.
-
current, üzerinde çalışılan, veriyle doldurulan ya da görüntülenen yapının adresini içerir.
-
new, malloc () işlevini kullanarak oluşturulan yeni bir yapının adresidir.
Satır 7, stok yapısını küresel ilan eder. Bu şekilde, çeşitli işlevlerden erişilebilir.
25 ve 39 Satırlar arasındaki for döngüsü, bunları birbirine bağlayan yeni yapılar oluşturur.Başlangıç yapısı özel, bu nedenle adres 30 Satır'da saklanır. Aksi halde make_structure () işlevi sayesinde yeni bir yapı atanır.
Satır 35'de önceki yapı güncellenir; akım değeri 36 Satır'a kadar değiştirilmez. Bu gerçekleşmeden önce, geçerli yapıdaki işaretçi yeni yapıdaki adresle güncellenir.
Satır 40'da, son yapıdaki yeni işaretçiyi NULL olarak sıfırlayarak bağlantılı listenin sonuna işaretlenir.
46. satırdaki while döngüsü, bağlantılı listedeki tüm yapıları görüntüler. Döngünün durumu geçerli göstericinin değeri. NULL ile karşılaşıldığında döngü durur.
Daha İyi Bağlı Liste Örneği'nde gösterilen kodun geri kalanı, kendine açık olan işlevlerden oluşur.
Alıştırma 2 : Daha İyi Bağlı Liste Örnekindeki kodu düzenleyiciye kopyalayın. Kurun ve çalıştırın.
fill_structure () işlevindeki scanf () ifadelerine dikkat edin. Unutmayın -> işaretçi için "peeker" gösterimdir. Adres almak için, değişkene scanf () işlevinde bir & ile önek eklemelisiniz.