У меня есть этот код для связанного списка, который я делаю. Перед добавлением функции удаления он работал красиво. После того, как я добавил его, появляется сообщение об ошибке, появившееся позже в сообщении. Я уже инициализировал его, как вы можете видеть, поэтому я не могу придумать, что вызывает проблему.Конфликтующие типы для функции «удалить»
#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
Я думаю, что это что-то делать с тем, как я инициализирован, но я не нашел орфографические ошибки/неправильные параметры. Кто-нибудь знает, в чем причина?
** Не ** ** typedef ** указатели! Руки прочь! Это бесполезно! Даже не думай об этом. Поместите его в бункер, окруженный минами, сторожевыми собаками. Убирайте место из своего мозга! Забудьте обо всем этом. - Надеюсь, что это предупреждение было не слишком тонким ... – Olaf
Вы не должны указывать указатели typedef в первую очередь, как сказал @Olaf, поскольку он значительно облегчает отладку, а также короче, чем Node *, а не NodePtr, поэтому нет никакого преимущества делать это ИМО. – saeleko
@LudaOtaku: Оба являются веской причиной, но не основной причиной. Указатели - это своеобразные виды; их принудительное шифрование делает код более трудным для чтения (даже с некоторым префиксом/суффиксом) и подверженным ошибкам. Хуже того: вы не можете квалифицировать объект, на который они указывают, поэтому вам нужно как минимум два 'typedef' для записи, например. 'const'-правильный код. Это также излишне загрязняет пространство имен. – Olaf