2016-10-27 9 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

@Olafはデバッグを著しく困難にすると同時に、NodePtrではなくNode *を入力する方が短くなるので、まずポインタをtypedefしてはいけませんこのIMO。 – saeleko

+0

@ LudaOtaku:どちらも正当な理由ですが、主な理由はありません。ポインタは、それぞれのタイプの権利です。それらを型定義すると、コードが読みにくくなり(接頭辞/接尾辞があっても)、エラーが発生しやすくなります。さらに悪いことに、あなたが指しているオブジェクトを修飾することはできません。したがって、少なくとも2つの 'typedef'が必要です。 'const'正しいコード。それはまた、名前空間を不必要に汚染します。 – Olaf

答えて

6

removeあなた自身と矛盾<stdio.h>remove()と呼ばれるC標準関数があります。最も簡単な解決方法は、関数の名前をmy_remove()のように変更することです。

+0

ありがとうございました! – mkahihu

+1

この回答が役に立ったとすると、[それを受け入れることを検討する](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –

+3

@mkahihuこの種の問題を発見するのを助けるために、エラーメッセージには、以前の宣言が "/usr/include/stdio.h"(標準ヘッダーの1つ)にあったことを伝える行が含まれています。標準ライブラリにその名前の関数があることを知らせます。 – Dmitri

関連する問題