C链表搜索功能

时间:2010-09-25 03:18:05

标签: c search linked-list

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

好的,我得到了什么。这应该编译。

问题来自

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

我收到分段错误,我不确定原因。

3 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:1)

调用elementExists时出现问题:

if(elementExists(&freqTable, newNum)){

您传递freqTable的地址(即指向存储列表第一个元素的指针的位置)而不是其值。然而在elementExists中,您取消引用该参数,就好像它是一个指向列表元素的指针:

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

else list = list->next;

&的通话中删除elementExists。如果您将列表作为参数传递,请不要在freqTable内引用全局elementExists

答案 2 :(得分:0)

正如评论中所建议的那样,在分配任何节点之前,您在freqTable中取消引用elementExists。因此,freqTable始终为NULL,因此您调用未定义的行为。您可以在elementExists中添加NULL检查,并在这种情况下返回false。