सी

2010-02-22 4 views
6

में एकमात्र लिंक की गई सूची बनाना मैं एक असाइनमेंट के लिए इनपुट टेक्स्ट फ़ाइल से एक सिंगल लिंक्ड सूची बनाने की कोशिश कर रहा हूं। मैं इसे एक समय में थोड़ा सा करने की कोशिश कर रहा हूं इसलिए मुझे पता है कि मेरा कोड पूरा नहीं हुआ है। मैंने हेड पॉइंटर बनाने और बस अपना मूल्य प्रिंट करने की कोशिश की और मैं इसे काम करने के लिए भी नहीं मिला, लेकिन मुझे यकीन नहीं है कि क्यों। मैंने संरचना, मेरी निर्माण सूची, और प्रिंट सूची कार्यों को शामिल किया। उस भाग के काम के बाद से मैंने खुली फ़ाइल शामिल नहीं की थी।सी

typedef struct List 
{ 
    struct List *next; /* pointer to the next list node */ 
    char *str;   /* pointer to the string represented */ 
    int count;   /* # of occurrences of this string */ 
} LIST; 

LIST *CreateList(FILE *fp) 
{ 
    char input[LINE_LEN]; 
    LIST *root;    /* contains root of list    */ 
    size_t strSize;   
    LIST *newList;   /* used to allocate new list members */ 

    while (fscanf(fp, BUFFMT"s", input) != EOF) { 

     strSize = strlen(input) + 1; 

     /* create root node if no current root node */ 
     if (root == NULL) { 
      if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) { 
       printf("Out of memory..."); 
       exit(EXIT_FAILURE); 
      } 
      if ((char *)malloc(sizeof(strSize)) == NULL) { 
       printf("Not enough memory for %s", input); 
       exit(EXIT_FAILURE); 
      } 
       memcpy(newList->str, input, strSize); /*copy string */ 
       newList->count = START_COUNT; 
       newList->next = NULL; 
       root = newList; 
     } 
    } 
     return root; 
} 

/* Prints sinly linked list and returns head pointer */ 
LIST *PrintList(const LIST *head) 
{ 
    int count; 

    for (count = 1; head != NULL; head = head->next, head++) { 
     printf("%s %d", head->str, head->count); 
    }      
    return head;  /* does this actually return the start of head ptr, b/c I want to 
          return the start of the head ptr. */ 
} 
+1

आप 'प्रिंटलिस्ट' में 'हेड ++' नहीं रखना चाहते हैं, 'head = head-> अगला' पहले से ही सूचक को बढ़ाता है। –

+1

क्या आपने इसे दो बार पूछा था? http://stackoverflow.com/questions/2309618/single-linked-lists-in-c – lorenzog

उत्तर

2

root में एक अनिर्धारित मान है, इसलिए यह प्रारंभ नहीं होगा। CreateList की दूसरी पंक्ति

LIST *root = NULL; 

भी होना चाहिए, और नीचे वहाँ जाहिरा तौर पर आइटम के विवरण के लिए आवंटन है, लेकिन एक) कोड आवंटन को पकड़ने और इसे कहीं भी बचाने के लिए विफल रहता है, और ख) का आकार आवंटन strSize होना चाहिए, न कि चर की लंबाई। वहाँ इसे ठीक करने के कई तरीके हैं, लेकिन सबसे सरल होगा:

newList->str = (char *)malloc(strSize); 
if (newList->str == NULL) 
1

आप पाश के लिए में head = head->next के बाद सिर incrementing नहीं किया जाना चाहिए। जब तक लूप नल न हो जाए तब तक लूप न रोकें क्योंकि प्रिंटलिस्ट हर बार वापस आ जाएगा। आपको उस सूची के प्रमुख को वापस करने की आवश्यकता क्यों है जिसे आपने अभी तक फ़ंक्शन में पास किया है?

संपादित करें:

LIST *current = head; 
while (current != NULL) { 
    printf("%s %d", current->str, current->count); 
    current = current->next; 
} 
+0

बस मेरा प्रोफेसर क्या चाहता है। और कॉन्स char * पैरामीटर ने मुझे भ्रमित कर दिया कि मैं लूप के माध्यम से कैसे पुन: प्रयास करूंगा। – Crystal

+0

आपको वर्तमान नोड में पॉइंटर बनाना चाहिए और इसे सिर से प्रारंभ करना चाहिए। फिर जब तक आप इसे वापस न करें तब तक सिर को तब तक स्पर्श न करें। –

1

दूसरा malloc स्मृति आवंटित करता है लेकिन इसकी वापसी मान, कुछ भी करने के लिए आवंटित नहीं किया गया है ताकि आबंटित स्मृति खो दिया है।

नई सूची आवंटित की गई है लेकिन प्रारंभ नहीं की गई है, इसलिए नए लिस्ट-> str को स्मृति की प्रतिलिपि बनाने के लिए एक memcpy का उपयोग करके नई सूची-> str बिंदुओं के बाद कुछ भी विफल हो जाएगा। शायद आप दूसरे मॉलोक के परिणाम को नए सूची-> str को सौंपा जाना चाहते थे, लेकिन आप इसे भूल गए।