#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);
}
我收到分段错误,我不确定原因。
答案 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。