2016-10-27 2 views
3

У меня есть этот код для связанного списка, который я делаю. Перед добавлением функции удаления он работал красиво. После того, как я добавил его, появляется сообщение об ошибке, появившееся позже в сообщении. Я уже инициализировал его, как вы можете видеть, поэтому я не могу придумать, что вызывает проблему.Конфликтующие типы для функции «удалить»

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

struct node 
{ 
    int value; 
    struct node* next; 
}; 

typedef struct node Node; 
typedef Node* NodePtr; 

void push(int value, NodePtr *start); 
void add(int value, NodePtr *start); 
void pop(NodePtr* start); 
void remove(NodePtr* start); //line 16 
void traverse(NodePtr* start); 
int main(void) 
{ 
    NodePtr first = NULL; 
    push(2, &first); 
    add(3, &first); 
    printf("%d, %p\n", first -> value, first -> next); 
    printf("%d, %p\n", first -> next -> value, first -> next -> next); 

    push(4, &first); 
    add(5, &first); 
    printf("%d, %p\n", first -> value, first -> next); 
    printf("%d, %p\n", first -> next -> value, first -> next -> next); 

    pop(&first); 
    pop(&first); 
    printf("%d, %p\n", first -> value, first -> next); 
    printf("%d, %p\n", first -> next -> value, first -> next -> next); 

    remove(&first); 
    add(6, &first); 
    printf("%d, %p\n", first -> value, first -> next); 
    printf("%d, %p\n", first -> next -> value, first -> next -> next); 
    return 0; 
} 

//push node to beginning 
void push(int value, NodePtr *start) 
{ 
    NodePtr newStart = malloc(sizeof(Node)); 
    if(newStart == NULL) 
    { 
     return; 
    } 
    newStart -> value = value; 
    newStart -> next = *start; 
    *start = newStart; 
} 
//add node to end 
void add(int value, NodePtr *start) 
{ 
    NodePtr newNode = malloc(sizeof(Node)); 

    if(newNode == NULL) 
    { 
     return; 
    } 

    newNode -> value = value; 
    newNode -> next = NULL; 

    NodePtr current = *start; 

    while((current)->next != NULL) 
    { 
     current = current -> next; 
    } 

    current -> next = newNode; 
} 
//pop beginning node 
void pop(NodePtr* start) 
{ 
    NodePtr trash = *start; 
    (*start) = (*start)->next; 
    free(trash); 
} 

//remove last node 
void remove(NodePtr* start) //line 87 
{ 
    NodePtr current = *start; 

    while((current)->next != NULL) 
    { 
     if(current->next == NULL) 
     { 
      break; 
     } 
     current = current -> next; 
    } 
    NodePtr trash = current -> next; 
    current -> next = current; 
    free(trash); 
}  

//goes through list 
void traverse(NodePtr* start) 
{ 
    NodePtr current = *start; 
    while((current -> next) != NULL) 
    { 
     current = current -> next; 
    } 
} 

Здесь ошибка

~/C-Programs> make zelda 
cc -g -Wall -Wextra -lm -std=c99 zelda.c -o zelda 
zelda.c:16: error: conflicting types for ‘remove’ 
/usr/include/stdio.h:177: note: previous declaration of ‘remove’ was here 
zelda.c:87: error: conflicting types for ‘remove’ 
/usr/include/stdio.h:177: note: previous declaration of ‘remove’ was here 
make: *** [zelda] Error 1 

Я думаю, что это что-то делать с тем, как я инициализирован, но я не нашел орфографические ошибки/неправильные параметры. Кто-нибудь знает, в чем причина?

+1

** Не ** ** typedef ** указатели! Руки прочь! Это бесполезно! Даже не думай об этом. Поместите его в бункер, окруженный минами, сторожевыми собаками. Убирайте место из своего мозга! Забудьте обо всем этом. - Надеюсь, что это предупреждение было не слишком тонким ... – Olaf

+0

Вы не должны указывать указатели typedef в первую очередь, как сказал @Olaf, поскольку он значительно облегчает отладку, а также короче, чем Node *, а не NodePtr, поэтому нет никакого преимущества делать это ИМО. – saeleko

+0

@LudaOtaku: Оба являются веской причиной, но не основной причиной. Указатели - это своеобразные виды; их принудительное шифрование делает код более трудным для чтения (даже с некоторым префиксом/суффиксом) и подверженным ошибкам. Хуже того: вы не можете квалифицировать объект, на который они указывают, поэтому вам нужно как минимум два 'typedef' для записи, например. 'const'-правильный код. Это также излишне загрязняет пространство имен. – Olaf

ответ

6

Существует стандартная функция C под названием remove() в <stdio.h>, которая конфликтует с вашим собственным remove. Самое простое решение - переименовать свою функцию на что-то вроде my_remove().

+0

Спасибо, что исправил это! – mkahihu

+1

Если этот ответ помог вам, [подумайте о его принятии] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –

+3

@mkahihu Чтобы в будущем выявить подобные вещи, обратите внимание, что ваши сообщения об ошибках включали строку, в которой говорится, что предыдущее объявление было в «/usr/include/stdio.h» (один из стандартных заголовков), который должен сообщить вам, что есть функция с таким именем в стандартной библиотеке. – Dmitri

Смежные вопросы