Двусвязный список, печатающий все правильно, но получающий ошибку сегментации в конце функции печати

Итак, я почти закончил с этой программой для своего последнего проекта, и я получаю ошибку сегментации ... Программа будет делать все правильно и выводит на экран все, но не выходит из функции printWordLength() . выводит ошибку сегментации в самом конце, я уверен, что это простое исправление, но в данный момент мой мозг дает сбой. (Прокрутите до самого низа, чтобы найти функцию печати виновника.

Если вы просто хотите использовать мой код, не стесняйтесь.

Цель. Эта программа содержит двусвязный список, который будет читать файл, введенный в качестве аргумента командной строки, читать каждую строку из файла, размечать каждое слово из строки и для каждого слова помещать его в Структура Word Length в зависимости от ее длины, а затем помещает ее в структуру word_count в зависимости от строки слова и подсчитывает вхождение каждого слова в файле.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DELIM " ,.+-=!?:;\t"
#define MAXLINE 25000

typedef struct word_count
{
    char * word;
    int count;
    struct word_count *next;
    struct word_count *prev;
} WORD;

typedef struct word_length_count
{
    int length;
    int count;
    WORD * words;
    struct word_length_count *next;
    struct word_length_count *prev;
} WLENGTH;

int splitIntoWords(char line[]);
void processLength(char * word);
void processWord(char * word, WORD * wordCount);
void printWordLength();
WLENGTH * createWordLength(char *word);
WORD * createWordCount(char *word);

WLENGTH * wordLength = NULL;

int main(unsigned int argc, unsigned char *argv[]){
    FILE *fpin;
    char line[MAXLINE];
    int totalWordCount = 0;

    if((fpin = fopen(argv[1], "r")) == NULL)
    {
            printf("Can't open input file.\n");
            exit(-1);
    }

    printf("This is the words all tokenized from the input!\n");
    while(fgets(line, MAXLINE, fpin) != NULL)
    {
            line[strcspn(line, "\n")] = '\0';
            if(line[0] == '\0')
                    continue;
            totalWordCount += splitIntoWords(line);
    }
    printf("Total number of words is: %d\n", totalWordCount);
    printWordLength();
    printf("\nFINISHED!");
}

int splitIntoWords(char line[])
{
    char *word;
    int count=0;
    word = strtok(line, DELIM);
    for(;word != NULL;)
    {
            count++;
            printf("%s\n", word);
            processLength(word);
            word = strtok(NULL, DELIM);
    }
    return count;
}

void processLength(char * word)
{
    WLENGTH *wLCounter = NULL;
    WLENGTH *wLLast = NULL;

    if(wordLength == NULL)
    {
            wordLength = createWordLength(word);
            return;
    }

    wLCounter = wordLength;

    while(wLCounter != NULL)
    {
            if(strlen(word) == wLCounter->length)
            {
                    ++wLCounter->count;
                    processWord(word, wLCounter->words);
                    return;
            }
            wLLast = wLCounter;
            wLCounter = wLCounter->next;
    }
    wLLast->next = createWordLength(word);
}

void processWord(char * word, WORD * wordCount){
    WORD * wCounter = NULL;
    WORD * wLast = NULL;

    if(wordCount == NULL)
    {
            wordCount = createWordCount(word);
            return;
    }
    wCounter = wordCount;
    while(wCounter != NULL)
    {
            if(strcmp(word, wCounter->word) == 0)
            {
                    ++wCounter->count;
                    return;
            }
            wLast = wCounter;
            wCounter = wCounter->next;
    }
    wLast->next = createWordCount(word);
}

WLENGTH * createWordLength(char *word)
{
    WLENGTH *wLCounter = NULL;
    wLCounter = (WLENGTH*)malloc(sizeof(WLENGTH));
    //wLCounter->count = (int*)malloc(int));
    //wLCounter->length = (int*)malloc(int));
    wLCounter->words = createWordCount(word);
    wLCounter->count = 1;
    wLCounter->length = strlen(word);
    wLCounter->next = NULL;
    return wLCounter;
}

WORD * createWordCount(char *word)
{
    WORD *wCount = NULL;
    wCount = (WORD*)malloc(sizeof(WORD));
    wCount->word = (char*)malloc(strlen(word+1));
    strcpy(wCount->word, word);
    wCount->count = 1;
    wCount->next = NULL;
    return wCount;
}

void printWordLength(){
    WLENGTH * temp = wordLength;
    WORD * tempWORD = wordLength->words;
    while(temp != NULL)
    {
            tempWORD = temp->words;
            printf("\nFor Word Length: %d : There are: %d occurances!\n",  temp->length, temp->count);
            while(tempWORD != NULL)
            {
                    printf("\t%s\toccurs:%d\n", tempWORD->word, tempWORD->count);
                    tempWORD = tempWORD->next;
            }
            temp = temp->next;
    }
}

Я не получал ошибок сегментации, пока не добавил цикл while для tempWORD. Но момент, когда у меня пукает мозг, заключается в том, что я не знаю, в чем проблема. Может проблема с указателем?


person SeanMG    schedule 03.05.2012    source источник
comment
Не пытаясь понять код, последняя строка выглядит как проблема - вам нужно проверить temp != NULL перед назначением tempWORD = temp->words. Если только вы не намеревались выполнить tempWord = temp->words задание перед переходом к временному ›следующему   -  person happydave    schedule 03.05.2012
comment
Вы были правы, и я был прав. У меня был момент пукания мозга. Мне пришлось переместить tempWORD = temp- ›words прямо в основной цикл while. Таким образом, это после того, как это будет проверено. Оцените это, бутон!   -  person SeanMG    schedule 03.05.2012
comment
Я новичок на этом сайте, поэтому вся эта репутация и то, как все работает, немного сбивает с толку, но он опубликовал ответ, и я его принял. Спасибо   -  person SeanMG    schedule 03.05.2012


Ответы (1)


Не пытаясь понять код, самая последняя строка выглядит как проблема - вам нужно проверить temp! = NULL перед назначением tempWORD = temp-> words. Если вы не намеревались выполнить задание tempWord = temp-> words перед переходом к temp-> next

person happydave    schedule 03.05.2012