2012-03-20 100 views
4

我试图用C语言编写的程序(代码::在windows块)。 我在头文件下面添加了它,它没有编译错误,但是当它运行代码时它会抛出一个错误的未定义的gotoxy引用。 查找完整的代码。 错误来了,我有gotoxy语句。未定义参考gotoxy用C

# include<stdio.h> 
# include<conio.h> 
# include<malloc.h> 
# include<stdlib.h> 
# include<windows.h> 
#include<dos.h> 
struct node 
{ int data; 
    struct node *link; 
}; 
void append(struct node **,int); 
void in_begin(struct node **,int); 
void del(struct node **,int); 
void in_middle(struct node **,int,int); 
int count(struct node *); 
void display(struct node *); 
char ans; 
int main() 
{ struct node *p; /* p can be said as the head or a start ptr */ 
    p=NULL; 
    /* Printing the menu */ 
    int num,loc; 
    char choice; 
    do 
    { //clrscr(); 
     printf("PROGRAM TO IMPLEMENT SINGLY LINKED LIST "); 
     printf("\n====================================="); 
     printf("\n\n1.Create \\ Appending The List"); 
     printf("\n2.Insert Node At Begining"); 
     printf("\n3.Insert Node In Middle"); 
     printf("\n4.Deleting a Node"); 
     printf("\n5.Counting The No Of Nodes"); 
     printf("\n6.Displaying the list"); 
     printf("\n7.Exit"); 
     oper: 
     gotoxy(1,15);printf("           "); 
     gotoxy(1,11);printf("\n\nEnter ur Choice : "); 
     choice=getch(); 
     switch(choice) 
     { 
      case '1': 
      // char ans; 
       do 
      { printf("Enter any number : "); 
       scanf("%d",&num); 
       append(&p,num); 
       printf("Enter more (y/n) :"); 
       fflush(stdin); 
       ans=getchar(); 
       }while(ans !='n'); 
      break; 
      case '2': 
      printf("Enter The Data : "); 
      scanf("%d",&num); 
      in_begin(&p,num); 
      break; 

      case '3': 
      printf("\nEnter The Position :"); 
      scanf("%d",&loc); 
      printf("\nEnter The Data : "); 
      scanf("%d",&num); 
      in_middle(&p,loc,num); 
      break; 

      case '4': 
      printf("\nEnter The Data u Want To Delete : "); 
      scanf("%d",&num); 
      del(&p,num); 
      break; 

      case '5': 
      printf("\nThe No Of Nodes Are %d",count(p)); 
      getch(); 
      break; 

      case '6': 
      display(p); 
      getch(); 
      break; 

      case '7': 
      printf("\n\nQuiting......."); 
      getch(); 
      exit(0); 
      break; 

      default: 
      gotoxy(1,15);printf("Invalid choice.Please Enter Correct Choice"); 
      getch(); 
      goto oper; 

     } 

    }while(choice !=7); 
return 0; 
} 

void append(struct node **q,int num) 
{ struct node *temp,*r; 
    temp = *q; 
    if(*q==NULL) 
    { temp = (struct node *)malloc(sizeof(struct node)); 
      temp->data=num; 
      temp->link=NULL; 
      *q=temp; 
    } 
    else 
    { temp = *q; 
     while(temp->link !=NULL) 
     { temp=temp->link; 
     } 
     r = (struct node *)malloc(sizeof(struct node)); 
     r->data=num; 
     r->link=NULL; 
     temp->link=r; 
    } 
} 

void display(struct node *q) 
{  if(q==NULL) 
     { printf("\n\nEmpty Link List.Can't Display The Data"); 
      getch(); 
      goto last; 
     } 
     while(q!=NULL) 
     { printf("\n%d",q->data); 
      q=q->link; 
     } 
    last: 
    ; 
} 

int count(struct node *q) 
{ int c=0; 
    if(q==NULL) 
    { printf("Empty Link List.\n"); 
     getch(); 
     goto last; 
    } 
    while(q!=NULL) 
    { c++; 
     q=q->link; 
    } 
    last: 
    return c; 

} 

void in_begin(struct node **q,int num) 
{ struct node *temp; 
    if(*q==NULL) 
    { printf("Link List Is Empty.Can't Insert."); 
     getch(); 
     goto last; 
    } 
    else 
    { temp=(struct node *)malloc(sizeof(struct node)); 
     temp->data=num; 
     temp->link=*q; 
     *q=temp; /* pointing to the first node */ 
    } 
    last: 
    getch(); 
} 

void in_middle(struct node **q,int loc,int num) 
{ struct node *temp,*n; 
    int c=1,flag=0; 
    temp=*q; 
    if(*q==NULL) 
    { printf("\n\nLink List Is Empty.Can't Insert."); 
     getch(); 
     goto last; 
    } 
    else 
    while(temp!=NULL) 
    { if(c==loc) 
     { n = (struct node *)malloc(sizeof(struct node)); 
      n->data=num; 
      n->link=temp->link; 
      temp->link=n; 
      flag=1; 
     } 
     c++; 
     temp=temp->link; 
    } 
    if(flag==0) 
    { printf("\n\nNode Specified Doesn't Exist.Cant Enter The Data"); 
     getch(); 
    } 
    else 
    { printf("Data Inserted"); 
     getch(); 
    } 
    last: 
    getch(); 
} 

void del(struct node**q,int num) 
{ if(*q==NULL) 
     { printf("\n\nEmpty Linked List.Cant Delete The Data."); 
      getch(); 
      goto last; 
     } 
     else 
     { 
     struct node *old,*temp; 
     int flag=0; 
     temp=*q; 
     while(temp!=NULL) 
     { if(temp->data==num) 
      { if(temp==*q)   /* First Node case */ 
       *q=temp->link; /* shifted the header node */ 
       else 
       old->link=temp->link; 

       free(temp); 
       flag=1; 
      } 
      else 
      { old=temp; 
       temp=temp->link; 
      } 
     } 
     if(flag==0) 
      printf("\nData Not Found..."); 
     else 
       printf("\nData Deleted...Tap a key to continue"); 
       getch(); 
     } 
     last: 
     getch(); 
     } 

请帮帮我。

+1

你可能需要链接库提供的功能。在Linux上,这将是'libncurses',但我不知道Windows。 – 2012-03-20 06:33:24

+1

它实现了什么库?你在链接吗?添加头文件'#include'语句不会解决链接错误。 – 2012-03-20 06:33:30

+1

发布您的确切错误 – 2012-03-20 06:36:30

回答

6

你面临的问题与Code::Blocks无关,它与它使用的编译器(默认为MinGW)有关,这是因为该函数不是标准的,并且在该编译器中没有实现。我不知道如果Borland公司仍然提供conio.h,但你可以尝试this oneMinGW

看一看这个http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html

您也可以尝试下面的代码片段,这将在GCC

#include<stdio.h> 
//gotoxy function 
void gotoxy(int x,int y) 
{ 
printf("%c[%d;%df",0x1B,y,x); 
} 
main() 
{ 
gotoxy(25,50); //reposition cursor 
printf("hello world"); //display text 
} 

的工作,你也可以看看NCURSES

2

代码::块(MinGW的),可是没有CONIO.H头文件。所以,你不能使用gotoxy()

#include<stdio.h> 
    #include<conio.h>  
    main() 
    {  
     gotoxy(10, 10);  
     printf("C program to change cursor position.");  
     getch(); 
     return 0; 
    } 

这个工作正常C.但不是在代码块。 你面对的是不相关的代码:: Blocks的问题,它涉及到它的使用(默认MinGW的)编译器,这是因为该功能不是标准的,并没有在该编译器实现的。 尝试使用这些:

SetConsoleCursorPosition(hConsole, TL); 
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 

,或者使用用Borland C支持CONIO.H。为了得到它访问LINK

# include<stdio.h> 
# include<conio.h> // you cant use conio.h 
# include<malloc.h> 
# include<stdlib.h> 
# include<windows.h> 
+0

我编辑了问题,请找到更新的问题 – 2012-03-20 06:47:27

+0

我现在找不到任何'gotoxy()' – 2012-03-20 06:50:04

3

对于什么是值得的,这里的老Borland的功能在十年前我可能写了一些Windows版本。

/* console_functions.h */ 


#ifndef __WINAPI_CONSOLE_WRAPPER_H 
#define __WINAPI_CONSOLE_WRAPPER_H 

void init_console_functions (void); 

void gotoxy (int x, int y); 

void clrscr (void); 

char getch (void); 


#endif /* __WINAPI_CONSOLE_WRAPPER_H */ 


/* console_functions.c */ 
#include "ConsoleFunctions.h"      
#include <windows.h> 

static HANDLE hStdout; 
static HANDLE hStdin; 
static CONSOLE_SCREEN_BUFFER_INFO csbi; 
static const COORD startCoords = {0,0}; 


void init_console_functions (void) 
{ 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    hStdin = GetStdHandle(STD_INPUT_HANDLE); 

    GetConsoleScreenBufferInfo(hStdout, &csbi); 
} 

void gotoxy(int x, int y) 
{ 
    COORD coord; 

    coord.X = x; 
    coord.Y = y; 

    SetConsoleCursorPosition(hStdout,coord); 
} 


void clrscr(void) 
{ 
    DWORD dummy; 

    FillConsoleOutputCharacter(hStdout, 
          ' ', 
          csbi.dwSize.X * csbi.dwSize.Y, 
          startCoords, 
          &dummy);  
    gotoxy(0,0); 
} 


char getch(void) 
{ 
    INPUT_RECORD inp_rec; 
    DWORD  bytes_read; 
    BOOL   success; 

    do 
    { 
    success = PeekConsoleInput(hStdin, &inp_rec, 1, &bytes_read); 
    FlushConsoleInputBuffer(hStdin); 
    } while(!success || inp_rec.EventType != KEY_EVENT || bytes_read==0); 

    return (char)inp_rec.Event.KeyEvent.uChar.AsciiChar; 
} 
1

有两件事情对这种题型用C 1),你必须有正确的prototp正确的头文件(这个我CONIO.H) 2)你必须有正确的库针对这种情况大概沿着libconio.lib

一些链接然后,您必须包括适当的头,你要举报的库您要链接的链接。

在GCC e.g的链接命令是-L和-l并且两者都需要使用conio。

参见:g++ conio.h: no such file or directory

问候

0

这是错误的,因为有一些人失踪能够处理gotoxy试试这个代码

int gotoxy(int x,int y) 
{ 
    COORD coord = {x,y}; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); 
}