سؤال

أحاول إنشاء قائمة مرتبطة منفردة من ملف نصي إدخال لتعيين. أحاول أن أفعل ذلك قليلاً في وقت واحد حتى أعرف أن الكود الخاص بي غير مكتمل. حاولت إنشاء مؤشر الرأس وطباعة قيمته فقط ولا يمكنني حتى الحصول على ذلك للعمل ، لكنني لست متأكدًا من السبب. قمت بتضمين الهيكل ، وقائمة إنشاء ، ووظائف قائمة الطباعة. لم أدرج الملف المفتوح لأن هذا الجزء يعمل.

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. */
}
هل كانت مفيدة؟

المحلول

root له قيمة غير محددة ، لذلك لن يتم تهيئتها. السطر الثاني من CreateList يجب ان يكون

LIST *root = NULL;

وأيضًا ، هناك تخصيص على ما يبدو لتفاصيل العنصر ، ولكن أ) يفشل الرمز في التقاط التخصيص وحفظه في أي مكان ، و ب) يجب أن يكون حجم التخصيص strSize, وليس طول المتغير نفسه. هناك عدة طرق لإصلاحها ، ولكن الأكثر وضوحًا هو:

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

نصائح أخرى

يخصص Malloc الثاني الذاكرة ولكن لا يتم تعيين قيمة الإرجاع الخاصة به بأي شيء ، بحيث يتم فقدان الذاكرة المخصصة.

تم تخصيص NewList ولكن لم يتم تهيئته ، لذا فإن استخدام memcpy لنسخ الذاكرة إلى NewList-> STR سيفشل لأن NewList-> str يشير إلى أي شيء. ربما أردت أن يتم تعيين نتيجة Malloc الثانية إلى NewList-> str ، لكنك نسيت ذلك.

يجب أن لا تتزايد الرأس بعد head = head->next في حلقة. ستعود قائمة الطباعة NULL في كل مرة منذ أن تتوقف الحلقة حتى يصبح الرأس لاغية. لماذا تحتاج إلى إعادة رأس القائمة التي انتقلت للتو إلى الوظيفة على أي حال؟

تعديل:

LIST *current = head;
while (current != NULL) {
    printf("%s    %d", current->str, current->count);
    current = current->next;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top