2011-10-20 12 views
2

私のMacでNetBeansでプロジェクト全体をやったところ、うまくいきました。それから私はターミナルに入れて学校用のsshサーバーに提出し、それに私にコンパイルエラーの束を与えます。 netbeansはC++などでコンパイルされましたか?私はCに新しいですので、どんな助けも確かに高く評価されています。ここにコードがあります。cのリンクリストのコンパイルエラー

/* 
* File: LinkedList.c 
* Author: dpiganell 
* 
* Created on October 17, 2011, 2:31 PM 
*/ 

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

struct element{ 
    int i; 
    struct element *next; 
}; 

void insert(struct element**, struct element*); 
void purge (struct element*, struct element*); 
void printList(struct element*); 
void printListBackwards(struct element*); 

struct element *h; 

int main() 
{ 
    // HEAD 
    h = (element *) malloc(sizeof(element)); 
    h = NULL; 

    // NEW VALUE 
    struct element *n = NULL; 

    // POINTER TO THE POINTER OF HEAD 
    struct element **headPointer; 
    headPointer = (element **) malloc(sizeof(element)); 

    int a; 
    a = 1; 
    while(a >= 0) 
    { 
     n = (element *) malloc(sizeof(element)); 

     printf("\nPlease enter an integer value: "); 
     scanf("%d", &a); 

     if(a >= 0) 
     { 
      n->i = a; 
      n->next = NULL; 
      headPointer = &h; 

      insert(headPointer, n); 

     n = n++; 


     } 
     printList(h); 
     printListBackwards(h); 
    } 

    return 0; 
} 


void insert(struct element **head, struct element *n) 
{ 
    element *nptr, *pptr, *cptr; 
    // NEW POINTER, PREVIOUS POINTER, CURRENT POINTER 

    nptr = (element *) malloc(sizeof(element)); 

    int purged; 
    purged = -1; 
    if(nptr != NULL) 
    { 
     nptr->i = n->i; 
     nptr->next = NULL; 

     cptr = *head; 
     pptr = NULL; 
    } 

    while(cptr != NULL && n->i >= cptr->i) 
    { 
     if(cptr->i == n->i && purged != 1) 
     { 
      purged = 1; 
      purge(cptr, pptr); 
     } 
     else 
     { 
      pptr = cptr; 
      cptr = cptr->next; 
     } 
    } 

    if(pptr == NULL && purged < 0) 
    { 
     nptr->next = *head; 
     *head = nptr; 
    } 
    else if(purged < 0) 
    { 
     pptr->next = nptr; 
     nptr->next = cptr; 
    } 
} 


void purge(struct element *current, struct element *predecessor) 
{ 
    element *ptr = (element *) malloc(sizeof(element)); 

    // ERASING THE HEAD 
    if(predecessor == NULL) 
    { 
     if(current->next == NULL) 
     { 
      current->next = NULL; 
      current->i = NULL; 
      current = NULL; 
      free(current); 
      h = NULL; 
     } 
     else 
      memcpy(current, current->next, sizeof(element)); 
    } 

    // ERASING THE TAIL 
    else if(current->next == NULL) 
    { 
     current->i = NULL; 
     free(current->next); 
     free(current); 
     predecessor->next = NULL; 
    } 

    // ERASING ANYTHING IN THE MIDDLE OF THE LIST 
    else 
    { 
     ptr = current->next; 
     predecessor->next = ptr; 
     current->i = NULL; 
     free(current->next); 
    } 
} 

void printList(struct element *head) 
{ 
    if(head == NULL) 
     printf("The list is empty."); 
    else 
    { 
     struct element *ptr; 
     ptr = (element*) malloc(sizeof(element));  
     ptr = head; 

     int a; 
     a = 1; 
     printf("Forwards: "); 
     while(a > 0) 
     { 
      printf("%d ", ptr->i); 
      if((ptr->next) == NULL) 
       a = -1; 
      else 
       ptr = ptr->next; 

     } 
    } 
} 

void printListBackwards(struct element *ptr) 
{ 
    if(ptr == NULL) 
    { 
     // DO NOTHING BECAUSE IT WILL BE PRINTED ALREADY THAT IT IS EMPTIED 
    } 
    else 
    { 
     element *cptr = (element *) malloc(sizeof(element)); 
     cptr = ptr; 
     if(ptr->next == NULL) 
      printf("\nBackwards: %d ", ptr->i); 
     else 
     { 
      printListBackwards(ptr->next); 
      printf("%d ", ptr->i); 
     } 
    } 
} 

また、エラーがあります。それはうまく動作し、netbeansで正常にコンパイルします。

LinkedList.c:14: warning: useless keyword or type name in empty declaration 
LinkedList.c: In function `main': 
LinkedList.c:26: error: `element' undeclared (first use in this function) 
LinkedList.c:26: error: (Each undeclared identifier is reported only once 
LinkedList.c:26: error: for each function it appears in.) 
LinkedList.c:26: error: syntax error before ')' token 
LinkedList.c:34: error: syntax error before ')' token 
LinkedList.c:40: error: syntax error before ')' token 
LinkedList.c: In function `insert': 
LinkedList.c:65: error: `element' undeclared (first use in this function) 
LinkedList.c:65: error: `nptr' undeclared (first use in this function) 
LinkedList.c:65: error: `pptr' undeclared (first use in this function) 
LinkedList.c:65: error: `cptr' undeclared (first use in this function) 
LinkedList.c:68: error: syntax error before ')' token 
LinkedList.c: In function `purge': 
LinkedList.c:110: error: `element' undeclared (first use in this function) 
LinkedList.c:110: error: `ptr' undeclared (first use in this function) 
LinkedList.c:110: error: syntax error before ')' token 
LinkedList.c: In function `printList': 
LinkedList.c:153: error: `element' undeclared (first use in this function) 
LinkedList.c:153: error: syntax error before ')' token 
LinkedList.c: In function `printListBackwards': 
LinkedList.c:179: error: `element' undeclared (first use in this function) 
LinkedList.c:179: error: `cptr' undeclared (first use in this function) 
LinkedList.c:179: error: syntax error before ')' token 
+0

定義していないタイプを使用しようとしています。 –

+0

これらのエラーを出した* exact *コードが表示されていますか?私がコンパイルすると、最初に表示されるエラーは 'element'が宣言されていないということです(Cでは、その型の名前は' struct element'です)。私はあなたがC++で見ているエラーを再現することはできません。 –

+0

@KeithThompsonエラーはC++ではありません。助けてくれてありがとうございました。私はそれをC++コンパイラのnetbeansでコンパイルしていました。しかし、私がgccを使用したときには、それをクリアするだけでは機能しませんでした。みんな、ありがとう。 –

答えて

5

、この定義

struct element{ 
    int i; 
    struct element *next; 
}; 

struct elementと呼ばなければなりません。あなたはすべてではなく、いくつかの場所でその権利を得る。知られているイディオムは次のとおりですので、あなたがタイプの前にstructを配置する必要はありませんelementstruct elementとしてのtypedef

typedef struct element { 
    int i; 
    struct element *next; 
} element; 

。これは非常に一般的なので、C++の種類は「あなたのためにこれを行います」ので、structは必要なくなりました。

4

それはC、あなたが裸elementを使用することはできませんだ、それはstruct elementです。

1

あなたの問題は、どのようにあなたのstruct elementを宣言するか、どのように使用するかに関連しています。

typedef struct element{ 
    int i; 
    struct element *next; 
} element; 

より満足な結果が得られます。

また、structはそのままで、裸のelementを使用する場合は、struct elementと書くことができます。

ところで:(私のコンパイラは私にそれについての警告を出した)

は、これはあなたの正確な問題に関連していないが、私は共有するだろうと思いました。

current->i = NULL; 

この場合、iは整数です。 Cでは、伝統的にNULLが使用されています。はポインタ型です。だから、混同しないよう、あなたに割り当てを変更する必要があり、次のいずれかiが実際にが、私はそれがない推測、上記の文脈与えられた(どこかのメモリを指すようにを意味している場合、

current->i = 0; 

...か)、それをポインタ型として宣言します。 Cにおいて

1

このように使用する場合は、構造体をtypedefする必要があります。それ以外の場合は、どこでもstructキーワードを使用する必要があります。

typedef struct element { 
    int i; 
    element *next; 
} element; 

あなたは要素を宣言するとき:だからあなたが言いたいdocumentation

を確認してください。それ以外の場合、コンパイラは、使用するたびにその要素が構造体であることを認識しません。

0
h = (element *) malloc(sizeof(element)); 
h = NULL; 
headPointer = (element **) malloc(sizeof(element)); 

これは最初のエラーです。要素はtypedefではなくstructタグです。 (これは他の人によって処理されている。)

をループで:

headPointer = &h; 

両方のポインタは、(のmalloc()d)の値が割り当てられています。それらを再割り当てすると、以前はmalloc()だったものが失われます。

「headPointer」のようなものが良い考えです。他のポインタを指すポインタです。これを使用して、呼び出された関数が呼び出し元のonの値を変更できるようにすることができます。しかし、あなたの使い方は正しくありません。通常、発信者が行う必要があります:関数の内部

struct clown *pipo=NULL; 
... 
my_function(&pipo); 

を、呼び出し側のポインタはより変更することができます:関数が返さ

void my_function (struct clown **ppp) { 
    ... 
    *ppp = malloc (sizeof (struct clown)); 
    ... 
} 

後、呼び出し側は、ポインタを使用することができ、それがうまくいけばで指します新しいピエロ それだけです。