2013-02-16 46 views
0

只是为了解释发生了什么,我正在将排序后的链接列表输入到方法中。在这个链表中是包含字符串的节点。节点包含字符串和2个计数器,将在后面提及。这些字符串是字母数字,可以重复。最后,我想输出一个链接列表,其中每个节点包含一个唯一字(全部为小写字母),一个出现次数的计数器,以及一个用于字的不同变化的计数器(差异是由某些字符的不同大小写引起的)。我相信它在逻辑上有效;但是,我遇到了分段错误。尝试从排序列表创建新链接列表时出现分段错误11

在此先感谢!

#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++; 
     } 
    } 
}; 
+1

将代码放在一个调试器。它会告诉你seg-fault在哪条线上。使用调试器来检查你的变量,你会知道为什么。 – abelenky 2013-02-16 00:19:02

回答

0

在循环

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

currNULLcurr = curr->next;后结束。

然后strcmp(prev->value, curr->value)解除引用空指针。

你可以改变循环条件

while(curr != NULL && curr->next != NULL) 
+0

我改变了这一点,它摆脱了分段错误!但是,似乎没有任何东西从方法输出... – user2074228 2013-02-16 00:32:30

+0

你没有在该函数'返回',没有编译器抱怨吗? – 2013-02-16 00:36:25

+0

@DanielFischer编译器不一定会抱怨在所有代码路径中不返回的非void函数。它可能是*未定义的行为,但实际上,可能发生的情况是调用方将假定堆栈中的值是返回的值。 – 2013-02-16 00:41:29