2016-03-22 36 views
-3

Bazı işlevler verildi, ancak ana çalışma yöntemi (ana liste) alınamıyor gibi görünüyor. Ne olacağını düşündüm 1 ana liste ve insert_at_front buna ekleyecektir, ancak sadece ilk listeyi (10) basar. Bağlantılı bir listeyi nasıl alabileceğimi bilen var mı? Şimdiden teşekkürler :)Bağlantılı bir liste nasıl yapılır (struct to pointer) - c

#include <stdlib.h> 
#include "week1.h" 

void insert_at_front(List *self, int data) 
{ 
    List newNode = (List)malloc(sizeof(struct node)); 
    newNode->data = data; 
    newNode->next = *self; 
    *self = newNode; 

} 

void print_list(List *self) 
{ 
    List current = *self; 

    while (current != NULL) 
    { 
     printf("%d\n", current->data); 
     current = current->next; 
    } 
    printf("\n"); 
} 

int main(void) 
{ 

    List *master; 


    insert_at_front(&master, 10); 
    insert_at_front(&master, 20); 

    print_list(&master); 

    return 0; 
} 

başlık: struct node yüzden List *master beyanı aslında bir node bir ponter bir göstericidir senin için bir işaretçi olarak

typedef struct node 
{ 
    int data; 
    struct node *next; 
} *List; 

void print_list(List *self); 
void insert_at_front(List *self, int data); 
+1

öğretici (http://pastebin.com/HC1DLK4M) – sp2danny

+1

Bu bir yinelenen değil @manniL. OP, kodun neden bekleneni yapmadığını soruyor. “Bağlantılı bir liste nasıl çalışır?” Konusunda açıklama istemiyor. – muXXmit2X

cevap

1

Sen typedefedList. master (&master) adresini alırken, bir göstericiye bir işaretçi için bir işaretçi node. Biraz senin :)

istediğini Bir node için bir işaretçi master beyanı değiştirmek gerekiyor ve daha sonra

List master; // before: List* master 

insert_at_front(&master, 10); 
insert_at_front(&master, 20); 

print_list(&master); 

Düzenleme

bunun adresini alma:

Ayrıca <stdio.h> dahil printf'u kullanmak için. Eğer malloc arayarak ama asla free arayarak bellek ayrılırken ediyoruz beri anda


ayrıca bir memory leak oluşturuyorsunuz.

Genelde yapabileceğiniz en iyi şey, ilk önce bellek ayıran bir şey yazdıktan hemen sonra belleği boşaltmak için bir temizleme işlevi yazmaktır. Bir temizleme bu gibi görünebilir: [burada]

void delete_list(List* self) 
{ 
    while ((*self)->next) 
    { 
    List tmp = *self; 
    List last; 
    while (tmp->next != NULL) 
    { 
     last = tmp; 
     tmp = tmp->next; 
    } 
    free(last->next); // delete the last node in the list 
    last->next = NULL; 
    } 
    free(*self); // now delete the only existing node 
} 
+0

teşekkürler yığınlar, işaretçi kısmı ile biraz kafa karıştırıcı, ama bir diyagram çizdi ve hepsi şimdi mantıklı! Çok teşekkür ederim :) Ben de ikinci bölüm için tüm yerel değişkenler işlev çağrısı sonra silinmiş olacağını düşündüm? (c çağrı dili ile bir çağrıdır? .. muhtemelen yanlış olsa da) – BriannaXD

+0

Ayrıca bir struct için bir işaretçi sahip noktası nedir? aptal soru, ama sadece bir yapıya sahip değil yapıya bir işaretçi olması hakkında daha iyi ne merak ediyor? tekrar teşekkürler :) – BriannaXD

+0

@BriannaXD Yığın üzerine bir değişken atanırsa, kapsamının sonuna ulaşıldığında otomatik olarak silinir. Hafızayı yığına el ile ayırırsanız, onu da boşaltmanız gerekir, aksi halde yerel işaretçi silinir, ancak bellekte bir şey göstermeden yığında bellek ayrılır. Şimdi işaretçi olayı. İşaretçi kullanmanız gerekmez, ancak yığının sağladığı bellekten daha fazla belleğe ihtiyacınız varsa yararlı olurlar. Yığında yığından daha büyük bir yığın bellek için bir işaretçi kullanabilirsiniz. Peki? – muXXmit2X

İlgili konular