2011-10-20 1 views
2

Я выполнил весь свой проект в NetBeans на моем mac, и он отлично работает. Затем я отправляюсь на терминал, чтобы отправить его на наш 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

Вы уверены, что указали нам * точный * код, который дал вам эти ошибки? Когда я его компилирую, первая ошибка, которую я вижу, заключается в том, что 'element' не объявлен (в C это имя типа' struct element'). Я также не могу воспроизвести ошибки, которые вы видите на C++. –

+0

@KeithThompson Ошибки не на C++. На этот вопрос был дан ответ, хотя спасибо за помощь. Я скомпилировал его в netbeans в компиляторе C++, и он сработал. Но когда я использовал gcc, это не работало, чтобы просто разобраться. Всем спасибо. –

ответ

5

В C, это определение

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

должен называться struct element. Вы получаете это право в некоторых местах, не все. Известный идиома:

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

Какие определения типов element, как struct element, так что вам не нужно размещать struct перед типом. Это было настолько распространено, что 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только для типов указателей. Так, чтобы не перепутать, вы должны либо изменить назначение на:

current->i = 0; 

... или, если на самом деле iэто означало, чтобы указать на память где-то (что учитывая контекст выше, я предполагаю, что это не), объявите его как тип указателя.

1

Вам нужно набрать свою структуру, если вы собираетесь использовать ее таким образом. В противном случае вам нужно использовать ключевое слово struct везде. Проверить documentation

Так вы хотите сказать:

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

при объявлении элемента. В противном случае компилятор не знает, что элемент является структурой при каждом использовании.

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

Это ваша первая ошибка. element является тегом struct, а не typedef. (Это было обработано другими.)

в петле:

headPointer = &h; 

Оба указателя были присвоены (d таНос()) значения. Переустанавливая их, вы теряете материал, который ранее был malloc() d.

Материал «headPointer» - хорошая идея. Это указатель, который может указывать на другие указатели. Вы можете использовать его, чтобы вызываемая функция изменяла значение указателя вызывающих. Но ваше использование неверно. Обычно абонент должен делать:

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

Внутри функции, указатель вызывающего, чем может быть изменен:

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

После завершения функции возвращается, абонент может использовать указатель, и мы надеемся, указывают на новый клоун. Вот и все.

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