如果在C?链表中它们是相同的,如何比较单词

时间:2017-02-01 21:56:15

标签: c

给出了代码。我需要计算不相同的单词数。为了做到这一点,我需要使用stcrmp比较它们。通过查看下面的代码,我需要构建while或if语句来使用双链表来比较文件中的单词?我想这个条件应该是主要打印它然后。我的病情不起作用。另外,您能否提供一些建议,以及如何按照其长度对单词进行排序? 要理解代码的一些解释: 该程序包含一个双向链表,它将读取作为命令行参数输入的文件,从文件中读取每一行,从行中标记每个单词,并根据每个单词的长度将其放入Word长度结构中,然后将它放入一个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->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) {
        WORD *tempWORD = wordLength->words;
        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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您在while的最外侧printWordLength()循环底部错过了此内容:

temp  = temp->next;

这就是它进入无限循环的原因(你没告诉我们)。

现在,要计算不同的单词,您只需计算每WORD*WORDLENGTH*中的每个printWordLength(),您可以在void printWordLength() { WLENGTH * temp = wordLength; WORD * tempWORD = wordLength->words; unsigned int unique_words = 0; while(temp != NULL) { WORD * tempWORD = wordLength->words; tempWORD = temp->words; printf("\nFor Word Length: %d : There are: %d occurences!\n", temp->length, temp->count); while(tempWORD != NULL) { printf("\t%s\toccurs:%d\n", tempWORD->word, tempWORD->count); unique_words++; tempWORD = tempWORD->next; } temp = temp->next; } printf("\nThere are %u unique words\n", unique_words); } 打印它们时执行此操作:

if (response.Content.Headers.ContentType.MediaType == "application/json")
{
    // parse json
}
else
{
    // parse xml
}