2010-09-25 107 views
-5
#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

/*Define custom functions */ 
void insertElement(); 
bool elementExists(); 
int getNumElements(); 


/*Create linked list */ 
struct node { 
    int number; 
    int occurence; 
    struct node *next; 
}; 

/*Call our linked list freqTable */ 
struct node *freqTable = NULL; 

unsigned int numElements = 0; 

int main(){ 
    int readNumElements = 0; 
    int i = 0; 
    int newNum, status; 

    status = scanf("%d", &readNumElements); 
    if(status == -1){ 
     fprintf(stderr, "%d is not a number\n", readNumElements); 
     exit(-1); 
    } 


    for (i = 0; i < readNumElements;i++) { 
     status = scanf("%d", &newNum); 
     if(status == -1){ 
      fprintf(stderr, "%d is not a number\n", newNum); 
      exit(-1); 
     } 
     if(elementExists(newNum)){ 
      printf("%d exists\n", newNum); 
     }else{ 
      insertElement(&freqTable, newNum); 
     } 

    } 

return 0; 
} 

void insertElement(struct node **list, int n){ 
    struct node *new_input; 

    new_input = malloc(sizeof(struct node)); 

    if(new_input == NULL){ 
     fprintf(stderr,"Error: Failed to create memory for new node\n"); 
     exit(EXIT_FAILURE); 
    } 

    new_input->number = n; 
    new_input->occurence = 1; 
    new_input->next = *list; 
    numElements++; 

    *list = new_input; 
} 

bool elementExists(int n){ 
    printf("%d\n", freqTable->number); 
return false; 
} 

int getNumElements(){ 
    return numElements; 
} 

好吧,繼承人我得到了什麼。這應該編譯。C鏈表搜索功能

問題出現在

if(elementExists(newNum)){ 
     printf("%d exists\n", newNum); 
    }else{ 
     insertElement(&freqTable, newNum); 
    } 

我得到的分割錯誤,我不知道爲什麼。

+1

代碼的其餘部分在哪裏? – NullUserException 2010-09-25 03:22:22

+2

如果你永遠不會分配一個節點並將其分配給'freqTable'變量,那麼總是要訪問內存位置0 +一些偏移量,以保證分段錯誤! – 2010-09-25 03:24:12

+0

我這樣做,我有一個插入功能。就像它說它在主要工作。我可以通過執行freqTable-> number來打印最後一個元素。我也可以做freqTable-> next->數字等等......我不能在我的elementExists函數中做到這一點。 – Matt 2010-09-25 03:30:09

回答

2

elementExists你需要確保功能freqTable不NULL

bool elementExists(int n){ 
if(freqTable) { // add this check 
    printf("%d\n", freqTable->number); 
} 
} 

而且你elementExists沒有做它應該做(檢查與價值n節點的存在),你應該這樣做:

bool elementExists(int n) { 

if(!freqTale) { // table does not exist..return false. 
    return false; 
} 
// table exists..iterate node by node and check. 
struct node *tmp = freqTable; 
while(tmp) { // loop till tmp becomes NULL 
    if(*tmp == n) { // it node contains n..return false. 
    return true; 
    } 
    tmp = tmp->next; // move on 
} 
return false; // n does not exist in the list..return false. 
} 
+0

謝謝,但我發現錯誤。希望這會幫助別人。 struct node * tmp = freqTable;我基本上做了struct node * tmp =&freqTable; – Matt 2010-09-25 04:08:18

0

正如評論中所建議的那樣,在分配任何節點之前,您需要先取消freqTableelementExists。因此,freqTable始終爲NULL,因此您調用未定義的行爲。您可以在elementExists中添加NULL檢查,並在此情況下返回false。

+0

你的正確。讓我更新它到我想要做的事情。 – Matt 2010-09-25 04:02:37

1

有與呼叫一個問題elementExists

if(elementExists(&freqTable, newNum)){ 

您通過freqTable的地址(即,指向指向列表第一個元素的指針所在的指針)而不是其值。然而,在elementExists取消引用的說法,就好像是一個指針列表元素:

printf("Compare with: %d\n", list->number); 

else list = list->next; 

從通話中刪除&elementExists。如果您將列表作爲參數傳遞,請不要參考elementExists中的全局freqTable

+0

是啊,注意到在codaddicts之後。謝謝。這正是我遇到的問題。現在都好。 – Matt 2010-09-25 04:49:34