【问题标题】:warning: extra tokens at end of #include directive警告:#include 指令末尾的额外标记
【发布时间】:2014-03-31 18:06:52
【问题描述】:

我是 C 编程新手,我正在做一个链表,以便我可以找到、显示、 插入、删除和排序节点;但是,编译器给了我这些错误:

main.c:1:19:警告:#include 指令末尾的额外标记[默认启用]

/usr/lib/../lib64/crt1.o:在函数_start': (.text+0x20): undefined reference tomain' collect2: error: ld 返回 1 个退出状态

我不知道它们是什么。

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


void dump_list (struct data_node *current); 

void dump_node (struct data_node *current);

struct data_node * find_node (struct data_node *p, int elem);    

int delete (struct data_node **p_first, int elem);

struct data_node * insert (struct data_node **p_first, int elem, char *newname);

struct data_node {    
    char name [25];    
    int data;    
    struct data_node *next;    
};    

void dump_list (struct data_node *current) {    
    printf("Printing list:\n");

    while (current != NULL) {    
       printf("%s: %d\n", current->name, current->data);
           current=current->next;    
    } /* end while */

    printf("\n");   

}; /* end dump_list */    

void dump_node (struct data_node *current) {    
    printf("Printing node: ");

    if (current != NULL)    
        printf("%s: %d\n", current->name, current->data);

}; /* end dump_node */

struct data_node * find_node (struct data_node *p, int elem) {    
    while (p != NULL) {    
        if ( elem == p->data )    
            return p;    
        p=p->next;    
    } /* end while */

    if(p==NULL){
       printf("Node not found\n");
       return p;
    }    
}; /* end find_node */

int delete (struct data_node **p_first, int elem) {    
    int retval = 0;    
    struct data_node *current, *prev;    
    current=*p_first;

    while (current != NULL && elem != current->data ) {    
        prev=current;    
        current=current->next;    
   }

    if (current == NULL) /* element not found */    
        return retval;

    /* current now points to node to delete */    
    if ( current == *p_first ) /* delete 1st node */    
        *p_first = (*p_first)->next;    
    else  /* link previous to next thus skipping over node to delete */    
        prev->next=current->next;

    free(current);

    retval=1;    
    return retval;
}; /* end delete */

struct data_node * insert (struct data_node **p_first, int elem, char *newname) {
    struct data_node *new_node, *prev, *current;    
    current=*p_first;

    while (current != NULL && elem > current->data) {    
        prev=current;
        current=current->next;

    } /* end while */

    /* current now points to position *before* which we need to insert */    
    new_node = (struct data_node *) malloc(sizeof(struct data_node));    
    new_node->data=elem;
    strcpy(new_node->name, newname);    
    new_node->next=current;

    if ( current == *p_first ) /* insert before 1st element */    
        *p_first=new_node; 
    else                       /* now insert before current */
        prev->next=new_node;    
    /* end if current == *p_first */

    return new_node;

}; /* end insert */


int main (void) {



char key;

int newelem;
char newstring [25];
int removeelem;
int findelem;

struct data_node *first=NULL, *ptr;



printf ("Enter list command (+-flx): ");

scanf (" %c", &key);
int newelem;
char newstring [25];
int removeelem;
int findelem;


switch (key)

   {

       /* tyep +*/

       case '+':


                 printf ("+ detected \n");

                 printf ("Enter key data: \n");

                 scanf ("%D", &newelem);

                 printf ("What string to store? \n");
                 gets(newstring);

                 insert(&first, newelem,newstring);

                 break;

       /* tyep -*/

       case '-':


                 printf ("- detected \n");

                 printf ("Enter key data: \n");

                 scanf ("%D", &removeelem);

                 delete(&first, removeelem);

                 if(delete(&first, removeelem) ==0)

                 printf ("Data not found.  No deletion performed. \n");

                 break;

       /* tyep f*/

       case 'f':


                 printf ("f detected \n");

                 printf ("Enter key data: \n");

                 scanf ("%D", &findelem);

                 while (ptr != NULL)

                 {
                 ptr=find_node(first, findelem);               

                 dump_node(ptr);

                 }

                 printf ("Node not found. \n");

                 break;

       /* tyep l*/

       case 'l':

                 printf ("l detected \n");

                 dump_list(first);

                 break;

       /* tyep x*/

       case 'x':

                 printf ("Goodbye. \n");


                 break;

       /* no default case necessary here */

   }

   return (0);

} /* end main */

【问题讨论】:

  • 你为什么重复你的#includes和你对data_node的定义?
  • 不要在 Web 端向我们发送您的整个代码,而是将其简化为重现您的问题的最小示例。通过这样做,您可能会自己发现错误。很可能这甚至不是产生错误的代码,而是您混淆了文件。
  • "main.c:1:19: 警告:#include 指令末尾的额外标记" 暗示这是第 19 行末尾的内容:可能是 #include &lt;stdlib.h&gt;。它可以是像'\r' 这样的空格。有时这发生在混合编辑器中。如果需要,删除第 19 行并重新输入。

标签: c pointers struct linked-list


【解决方案1】:
#include <stdio.h>

#include <string.h>

#include <stdlib.h>





struct data_node {

   char name [25];

   int data;

   struct data_node *next;

   };

你已经声明了两次 struct data_node 并写了两次#include。

【讨论】:

  • 我的错,我删除了重复但仍然给我同样的错误
  • @user2864813 你定义了 struct data_node 两次
【解决方案2】:

您还需要从switch 块中移动变量定义并将它们放在main 的开头。

我所说的台词是:

int newelem;
char newstring [25];
int removeelem;
int findelem;

【讨论】:

  • 我只是将它们放在 main 下并更新了上面的代码,但仍然给我错误
  • 我看到你复制了两次。至少,这是我在发布的代码中看到的。
  • 抱歉哪些行是重复的?我的眼睛很不好
  • 查看char key;scanf (" %c", &amp;key); 之后的行。
【解决方案3】:

我用 C 编程已经有一段时间了,但我似乎记得如果函数声明是在 int main(void) {} 函数之前定义的,则函数声明不是必需的。我认为您的其他函数之一有错误,导致编译器无法找到 main 函数。尝试将它们放在main 下方,看看会发生什么。

【讨论】:

    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2014-09-07
    相关资源
    最近更新 更多