2009-08-06 22 views
11

यह सी प्रोग्रामिंग भाषा में एक लिंक्ड सूची के लिए कोड है।सी में संरचना का उपयोग कैसे करें?

#include <stdio.h> /* For printf */ 
#include <stdlib.h> /* For malloc */ 

typedef struct node { 
    int data; 
    struct node *next; /* Pointer to next element in list */ 
} LLIST; 

LLIST *list_add(LLIST **p, int i); 
void list_remove(LLIST **p); 
LLIST **list_search(LLIST **n, int i); 
void list_print(LLIST *n); 

कोड पूरा नहीं हुआ है, लेकिन मुझे लगता है कि यह मेरे प्रश्न के लिए पर्याप्त है। यहां स्ट्रक्चर नोड "एलआईएलएसटी" के अंत में उपयोग किया जाता है, और इसे फ़ंक्शन list_add के प्रोटोटाइप में रिटर्न प्रकार के रूप में भी उपयोग किया जाता है। क्या हो रहा है?

उत्तर

6

typedef आपके प्रोग्राम में एक नया "प्रकार" बनाता है, इसलिए वापसी कार्यों और उन कार्यों के पैरामीटर के प्रकार केवल आपकी संरचना हैं। इस प्रकार के लिए struct node का उपयोग करने के लिए यह सिर्फ लघुरूप है।

आप एक नया नोड बनाने के लिए थे, तो आप इसे इस तरह कर सकता है (प्रकार का उपयोग): अपने प्रश्न में समारोह प्रोटोटाइप के साथ, इसके अलावा

LLIST *node = malloc(sizeof(LLIST)); 
node->data = 4; 
node->next = someOtherItem; 
list_add(node, 1) 

, तुम सच में डबल की जरूरत नहीं है संकेत दिए गए; के बाद से अपने struct में डेटा सिर्फ एक int है, तो आप की तरह

LLIST *list_add(int data, int position); 

कुछ करना तो list_add समारोह, आवंटन संभाल struct में int कॉपी और जुड़ा हुआ सूची में जोड़ने होगा सकता है।

एक निश्चित स्थिति में उस में लाना नव आवंटित नोड के पते पर पहले नोड में next सूचक को बदलने के रूप में सरल है, और नए नोड में next सूचक (एक अगले एक पर बात करने के लिए उस से पहले नोड मूल रूप से इंगित कर रहा था)।

ध्यान रखें कि (आपके बाकी फ़ंक्शन प्रोटोटाइप दिए गए हैं) आपको उन सभी नोड्स को पॉइंटर्स का ट्रैक रखना होगा जिन्हें आप सभी को हटाने के लिए बनाते हैं।

मुझे यकीन नहीं है कि मैं समझता हूं कि खोज फ़ंक्शन कैसे काम करेगा। यह पूरी चीज बहुत बेहतर लागू की जा सकती है। नहीं है जब आप इसे बनाते समय नोड का स्थान प्रदान करते हैं (क्या होगा यदि आप नोड्स की तुलना में अधिक संख्या निर्दिष्ट करते हैं?), आदि

10

एलआईएलएसटी संरचना के लिए एक और प्रकार का नाम है जो बनाया गया है।

typedef struct x { ... } NAME; 
23

यह एक typedef है: सामान्य में, निम्न स्वरूप एक प्रकार "NAME" है कि एक "struct x" पैदा करेगा। यह वास्तव में एक बार में दो चीजें कर रहा है। सबसे पहले, यह एक संरचना को परिभाषित करता है:

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

और फिर करता है एक typedef:

typedef struct node LLIST; 

इसका मतलब है कि LLIST, एक प्रकार है सिर्फ int या FILE या char की तरह, कि, struct node के लिए एक आशुलिपि है आपके लिंक्ड-सूची नोड संरचना। यह जरूरी नहीं है - आप उन सभी स्थानों में struct node के साथ प्रतिस्थापित कर सकते हैं - लेकिन यह पढ़ने के लिए थोड़ा आसान बनाता है, और अजीब अंत उपयोगकर्ताओं से कार्यान्वयन को छिपाने में मदद करता है।

10

सी की आवश्यकता है कि आप "संरचना" उपसर्ग के साथ structs संदर्भित करें, इसलिए कम वर्बोज़ उल्लेख के लिए टाइपिफ़ को पेश करना आम बात है।

है यही कारण है, अपने struct की घोषणा के दो भाग हैं, और इस तरह के रूप में लिखा जा सकता है:

struct node { 
    int data; 
    struct node *next; /* pointer to next element in list */ 
}; 

typedef struct node LLIST; 

तो, LLISTstruct node (धन्यवाद क्रिस लुट्ज़) के लिए सिर्फ एक और नाम है।

3

LLIST*LLIST संरचना द्वारा परिभाषित संरचना के लिए एक सूचक है।

आप कुछ स्मृति इस सूची के लिए आवंटित करने के लिए

LLIST* myList = malloc(sizeof(LLIST)*number_of_elements); 

करना चाहिए। वस्तुओं को जोड़ने और हटाने के लिए आपको रीयलोक का उपयोग करके स्मृति को पुन: आवंटित करने की आवश्यकता होती है। मैंने पहले ही सूचियों के लिए कोड का कुछ टुकड़ा लिखा है (सरणी के साथ बनाया गया है)।

जैसे ही मैं घर हूं, मैं कोड पोस्ट कर सकता हूं, जो वर्तमान में मामला नहीं है।

+0

तकनीकी रूप से, आपको प्रत्येक आइटम के लिए 'malloc' करना चाहिए सूची में, क्योंकि यह सख्ती से एक सूची नहीं है लेकिन सूची में अगले आइटम पर सूचक ('* अगला') के साथ एक संरचना है। इसलिए, आप प्रत्येक सूची आइटम के निर्माण पर एक अलग malloc करते हैं। – wizzwizz4

संबंधित मुद्दे