2010-10-21 15 views
28

C içinde bir BağlantılıList yazıyorum, aşağıdaki kod benim Düğüm tanımımı temsil ediyor.Kendisine işaretçi içeren bir typedef yapısı nasıl tanımlanır?

typedef struct { 
    int value; 
    struct Node* next; 
    struct Node* prev; 
} Node; 

anlıyorum (ya da ben düşünüyorum) typedef struct Node olarak struct Node aynı değil. Benim kod derlenmiş ve olması gerektiği gibi çalışır, ancak, ben next ve prev (uyarı: atama uyumsuz işaretçi türünden atama) atarken bir çok uyarı alırsınız. Bunun Düğüm yapısında onları nasıl tanımladığımla ilgili olduğunu tahmin ediyorum. O nasıl typedef struct Nodenext ve prev tanımlamalıdır, gerçekten sorun olup olmadığını Ben here

Yani tam kaynağını yükledi?

Bu bir repost olabilir, ama aradığım şeyi tam olarak bulamadığım için endişelendim. Teşekkürler.

+0

Bağlantılı listeniz bana çok garip geliyor. Prev ve sonraki ne zaman o zaman neden kafa ve kuyruk ihtiyacınız var? C'de iyi bağlantılı bir liste bulun ve bundan öğrenin. Apache Runtime Library'yi öneriyorum. Bence bağlantılı bir listesi var. Başlık ve kuyruğa işaret eden – frast

+2

, O (n) yerine O (1) eklemeyi ve eklemeyi sağlar. Diğer hatalar görüyorsanız bana bildirin çünkü bu sadece C becerilerimi Java'nın tüm bu yıllarından sonra biraz taze tutmak için bir alıştır .. –

cevap

55

Bu emre bunu yapmak gerekir: İstediğin tam olarak ne yaparlar, ama sorunu çözer ve nasıl yapıldığını bu genellikle gelmez

typedef struct Node Node; 

struct Node 
{ 
    int value; 
    Node *next; 
    Node *prev; 
}; 

. Daha iyi bir yol olduğunu düşünmüyorum.

Bu tür bir ileri bildirim, veri gizlemede ikinci bir kullanıma sahiptir. liste, bir kütüphanede uygulanan varsa, gibi fonksiyonları ile birlikte kamu başlığında sadece typedef olabilir:

Node * list_new(void); 
Node * list_append(Node *head, Node *new_tail); 
size_t list_length(const Node *head); 

Bu şekilde, kütüphane kullanıcılarının dahili özelliklerine kolay erişim yok senin kütüphane, yani Node yapısının alanları.

typedef struct NodeT { 
    int value; 
    struct NodeT * next; 
    struct NodeT * prev; 
} Node; 

Not NodeT tanıtılması ve Node kadar next ve prev içinde kullanım mevcuttur:

+2

Evet. İleri bir beyanname (http://en.wikipedia.org/wiki/Forward_declaration) tam olarak ihtiyaç duyulan şeydir. –

+0

Oh vay. Sanırım bunun dışında her kombinasyonu denedim! Teşekkürler! uyarıların hepsi gitti! :) –

+0

Doğru, ileri beyanların farkındayım ve bunları C++ boyunca kullandım, ama bu özel durumu daha önce hiç gelmedim, typedef/structs ile yalnız bırakın :) –

17

başka kabul edilebilir bir şekilde ve OP kodu en az değişiklik ile aşağıdadır.

+0

Aslında bu benim uygulamamda ne yaptığımı gösteriyor. :) başına @R .. 'yorum –

İlgili konular