0

何が起こっているのかを説明するために、ソートされたリンクリストをメソッドに入力しています。このリンクリストには、文字列を含むノードがあります。ノードには、文字列と、後で説明する2つのカウンターが含まれています。これらの文字列は英数字であり、繰り返すことができます。最後に、各ノードに一意の単語(すべて小文字)、出現回数のカウンター、および単語のさまざまな分散のカウンターが含まれるリンクリストを出力したいと思います(分散は特定の文字のさまざまな大文字化によって発生します) )。私はそれが論理的に機能すると信じています。ただし、セグメンテーション違反が発生します。

前もって感謝します!

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

typedef int bool;
#define TRUE 1
#define FALSE 0


struct Node{
  char value[100];
  int numOccur;
  int numVariance;
  struct Node *next;
};




struct Node * getFinalNodes(struct Node *head){
    struct Node * curr;
    struct Node * finalNode;
    struct Node * ptr;
    struct Node * finalCurr;
    struct Node * prev;
    int m = 0;
    int z = 0;
    char lowercase1[100];
    char lowercase2[100];

    curr = head;                                        //curr = head of sorted node
    finalNode = head;
    ptr = finalNode;
    finalCurr = finalNode;

    for(m = 0; curr->value[m] != '\0'; m++){
        finalNode->value[m] = tolower(curr->value[m]);          //gets first word all lower-cased
    }

    ptr->numOccur=1;                                     //occurance is 1
    ptr->numVariance=1;                                  //variance is 1
    while(curr != NULL && curr->next != NULL){
        prev = curr;
        curr = curr->next;
        if((strcmp(prev->value, curr->value) != 0) && (strlen(prev->value) == strlen(curr->value))){            //example: Ab vs. AB
            for(z=0; curr->value[z] != '\0'; z++){                                                               //turn prev and curr into lowercase
                lowercase1[z] = tolower(prev->value[z]);                                                        //ex. Ab->ab and AB->ab
                lowercase2[z] = tolower(curr->value[z]);
            }
            if(strcmp(lowercase1,lowercase2) == 0){                                                              //if values are same, that means they are the same words, just different capitalizations
                ptr->numOccur++;
                ptr->numVariance++;
            }
            else{                                                                                               //if values are different, then they are completely different strings and put curr.value into a new finalNode
                strcpy(finalNode->value,lowercase2);
                ptr->next = finalNode;
                ptr = ptr->next;
                ptr->numOccur = 1;
                ptr->numVariance =1;
            }
        }
        else if((strcmp(prev->value, curr->value) != 0) && (strlen(curr->value) != strlen(prev->value))){                                                                     //created arrays for prev and curr
            for(z=0; curr->value[z] != '\0'; z++){                                                               //turn prev and curr into lowercase                                                      //ex. Ab->ab and AB->ab
                lowercase2[z] = tolower(curr->value[z]);
            }
            strcpy(finalNode->value,lowercase2);
            ptr->next = finalNode;
            ptr = ptr->next;
            ptr->numOccur = 1;
            ptr->numVariance =1;
       }
       else if(strcmp(prev->value, curr->value) == 0){
            ptr->numOccur++;
       }
    }
};
4

1 に答える 1

0

ループの中

while(curr != NULL){
    prev = curr;
    curr = curr->next;
    if((strcmp(prev->value, curr->value) != 0) && (strlen(prev->value) == strlen(curr->value))){

currNULL後に最後にありcurr = curr->next;ます。

次にstrcmp(prev->value, curr->value)、null ポインターを逆参照します。

ループ条件を次のように変更できます

while(curr != NULL && curr->next != NULL)
于 2013-02-16T00:26:49.953 に答える