函数返回指针类型、简单链表的应用

原创 2007年10月15日 18:58:00

//本文中有一函数值得学习,不多讲看代码

#include ...................................//这里省略了.h文件

#define FD_MAX_NUMS 10

typedef struct FD_TYP
{
 int x,y;
 int xv,yv;
 FD_TYP *next;
}FD, *FD_PTR;

typedef struct FD_NUM_TYP
{
 FD fd_line[10];
 FD fd_curr_every[10];
}FD_NUM,  *FD_NUM_PTR;

FD *fd_link = NULL;
FD_NUM fd_num;

typedef struct TRACE_FD_TYP //跟踪飞弹
{
 int x,y;
 TRACE_FD_TYP *next;
} TRACE_FD, *TRACE_FD_PTR;

typedef struct TRACE_FD_NUM_TYP       
{
 TRACE_FD trace_fd_num[10];     //hold trace fd line
 TRACE_FD curr_fd_pos[10];      //everone current position point
}TRACE_FD_NUM, *TRACE_FD_NUM_PTR;

TRACE_FD_NUM gtrace_fd_manage;

int Shutdown(void)
{
 //free(&(fd_num.fd_line[0]));
 free(fd_link);

    return 1;
} // end shutdown
//
FD *Create_Fd_Pos(void )
{
 FD *temp_fd ,*curr_fd , *head_fd;
 temp_fd = curr_fd = head_fd = NULL;
 temp_fd = (FD *)malloc(sizeof(FD));
 head_fd = curr_fd = temp_fd;
 for (int i=0; i<10; i++)
 {
  
  temp_fd->x =  i;
  temp_fd->y =  i;
  temp_fd->xv = 1;
  temp_fd->yv = 2;
  temp_fd->next = NULL;
  if (i<9)
   temp_fd = (FD *)malloc(sizeof(FD));
  else
   temp_fd = NULL;
  curr_fd->next = temp_fd;
  curr_fd = curr_fd->next;
 } // end for i
 
 return head_fd;
} // end create_fd_pos

//
FD *Create_Fd_Pos_Array1(void )
{
 FD *temp_fd ,*curr_fd , *head_fd;
 temp_fd = curr_fd = head_fd = NULL;
 temp_fd = (FD *)malloc(sizeof(FD));
 head_fd = curr_fd = temp_fd;
 for (int i=0; i<10; i++)
 {
  
  temp_fd->x =  i*2;
  temp_fd->y =  i*2;
  temp_fd->xv = 31;
  temp_fd->yv = 32;
  temp_fd->next = NULL;
  if (i<9)
   temp_fd = (FD *)malloc(sizeof(FD));
  else
   temp_fd = NULL;
  curr_fd->next = temp_fd;
  curr_fd = curr_fd->next;
 } // end for i
 
 return head_fd;
} // end Create_Fd_Pos_Array1

//
FD *Create_Fd_Pos_Array2( int n )
{
 FD *temp_fd ,*curr_fd , *head_fd;
 temp_fd = curr_fd = head_fd = NULL;
 temp_fd = (FD *)malloc(sizeof(FD));
 head_fd = curr_fd = temp_fd;
 for (int i=0; i<10; i++)
 {
  
  temp_fd->x =  i*n;
  temp_fd->y =  i*n;
  temp_fd->xv = 31+n;
  temp_fd->yv = 32+n;
  temp_fd->next = NULL;
  if (i<9)
   temp_fd = (FD *)malloc(sizeof(FD));
  else
   temp_fd = NULL;
  curr_fd->next = temp_fd;
  curr_fd = curr_fd->next;
 } // end for i
 
 return head_fd;
} // end Create_Fd_Pos_Array2

int Main_Program(void)
{
 FD *curr_link =NULL;
 fd_link = Create_Fd_Pos();
/*
 fd_num.fd_line[0] = *Create_Fd_Pos_Array1();
 fd_num.fd_curr_every[0] = fd_num.fd_line[0];
 
 fd_num.fd_line[1] = *Create_Fd_Pos_Array2(4);
 fd_num.fd_curr_every[1] = fd_num.fd_line[1];

 for (int i=2;i<10;i++)
 {
  fd_num.fd_line[i] = *Create_Fd_Pos_Array2(2*i);
  fd_num.fd_curr_every[i] = fd_num.fd_line[i];
 } // end for i
*/ 

 

 curr_link = fd_link;
 for (int a=0;a<10;a++)
 {
  if (curr_link==NULL)
   break;
  printf("%d  x=%d  y=%d  xv=%d  yv=%d/n",a,curr_link->x,curr_link->y,curr_link->xv,curr_link->yv);
        curr_link = curr_link->next;
 } // end for

 

 return 1;
} // end Main_Program

// TRACE FD ////////////////////////////////////////////////////
TRACE_FD *Trace_FD( int x1, int y1, int x0=rand()%640, int y0=0)
{
 int dx,         // difference in x's
    dy,             // difference in y's
    dx2,            // dx,dy * 2
    dy2,
    x_inc,          // amount in pixel space to move during drawing
    y_inc,          // amount in pixel space to move during drawing
    error,          // the discriminant i.e. error i.e. decision variable
    index;          // used for looping
 int tmpx,tmpy;

// init trace_fd struce
 TRACE_FD *temp_trace_fd,*head_fd,*curr_pos_fd;
 head_fd = curr_pos_fd=temp_trace_fd=NULL;
 temp_trace_fd = (TRACE_FD *)malloc(sizeof(TRACE_FD));
 head_fd = curr_pos_fd=temp_trace_fd;
 
    tmpx = x0;
 tmpy = y0;
// compute horizontal and vertical deltas
dx = x1-x0;
dy = y1-y0;

//compute x1,y1 end


// test which direction the line is going in i.e. slope angle
if (dx>=0)
   {
   x_inc = 1;

   } // end if line is moving right
else
   {
   x_inc = -1;
   dx    = -dx;  // need absolute value

   } // end else moving left

// test y component of slope

if (dy>=0)
   {
   y_inc = 1;
   } // end if line is moving down
else
   {
   y_inc = -1;
   dy    = -dy;  // need absolute value

   } // end else moving up

// compute (dx,dy) * 2
dx2 = dx << 1;
dy2 = dy << 1;

// now based on which delta is greater we can draw the line
if (dx > dy)
   {
   // initialize error term
   error = dy2 - dx;

   // draw the line
   for (index=0; index <= dx; index++)
       {

       // test if error has overflowed
       if (error >= 0)
          {
          error-=dx2;

          // move to next line
          //temp_trace_fd->y+=y_inc;
    tmpy+=y_inc;
    temp_trace_fd->x=tmpx;
          temp_trace_fd->y=tmpy;
    } // end if error overflowed

       // adjust the error term
       error+=dy2;
   
       // move to the next pixel
    tmpx+=x_inc;
    temp_trace_fd->y = tmpy;
    temp_trace_fd->x = tmpx;
    temp_trace_fd->next = NULL;
    if (index<dx)
   temp_trace_fd = (TRACE_FD *)malloc(sizeof(TRACE_FD));
    else
   temp_trace_fd = NULL;

    curr_pos_fd->next = temp_trace_fd;
    curr_pos_fd = curr_pos_fd->next;
       } // end for

   } // end if |slope| <= 1
else
   {
   // initialize error term
   error = dx2 - dy;

   // draw the line
   for (index=0; index <= dy; index++)
       {
      
       // test if error overflowed
       if (error >= 0)
          {
          error-=dy2;

          // move to next line
          //temp_trace_fd->x+=x_inc;
          tmpx+=x_inc;
    temp_trace_fd->x = tmpx;
    temp_trace_fd->y = tmpy;
          } // end if error overflowed

       // adjust the error term
       error+=dx2;

       // move to the next pixel
       //temp_trace_fd->y+=y_inc;
    tmpy+=y_inc;
    temp_trace_fd->x=tmpx;
    temp_trace_fd->y=tmpy;

    temp_trace_fd->next = NULL;
    if (index<dx)
   temp_trace_fd = (TRACE_FD *)malloc(sizeof(TRACE_FD));
    else
   temp_trace_fd = NULL;

    curr_pos_fd->next = temp_trace_fd;
    curr_pos_fd = curr_pos_fd->next;
       } // end for

   } // end else |slope| > 1

// return success
return head_fd;

} // END Trace_FD

int main(int argc, char* argv[])
{
 Init_Program();

 Main_Program();

 Shutdown();
   
 return 0;
}

 

关于函数返回值为指针类型的分析

先看一个例子,这是初学者经常遇到的问题 char *GetString(void) {  char p[] = "hello world";  return p; //编译器一般将提出警告...
  • zxccaoya
  • zxccaoya
  • 2016年12月05日 18:58
  • 5297

函数的返回类型可以为值、指针、引用,这三种返回类型有什么不同,各有什么好处?(c++)

函数返回类型是值时,这种情况是最简单的,只需满足接受返回值的变量是个同类型的左值即可。 函数返回值是指针: 一个函数可以返回一个int,float,char型的数据,也可以返回一个指针类型的数据。...
  • j2013210855
  • j2013210855
  • 2014年11月07日 23:12
  • 3203

C++学习记录之函数返回值为指针的问题

一般在函数中定义一个对象有两种方法: 1、在栈上建立局部变量。注意,在栈上时!栈用于函数是为了返回时找得到调用点(在调用时压入栈的) ,那么,返回时要POP才能得到。函数体中建立的任何东西都释放掉了,...
  • xiaowenliuwen
  • xiaowenliuwen
  • 2015年11月18日 19:59
  • 1574

函数指针,指针函数,返回值为指针的函数

在学习C语言时,一个比较容易混淆的概念就是函数指针、指针函数、返回值为指针的函数。本文将对这三个概念进行区分。指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同。函数指针就是一个指向函...
  • wangxufa
  • wangxufa
  • 2017年06月08日 21:23
  • 619

函数指针类型与decltype

/* decltype的使用: 以下来自百度百科的解释: 在C++中,decltype作为操作符,用于查询表达式的数据类型。decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛...
  • liuguangsh
  • liuguangsh
  • 2016年11月03日 13:34
  • 512

[指针四] 通过函数进行动态内存申请---二级指针、函数返回值

通常,我们希望通过调用一个函数来进行动态申请ne
  • lngag110
  • lngag110
  • 2014年07月06日 16:28
  • 773

声明返回数组指针的函数

声明返回数组指针的函数
  • u012333003
  • u012333003
  • 2014年05月18日 12:43
  • 1518

指针类型的参数和返回值

本文来自LinuxC,一下整理为
  • hailushijie
  • hailushijie
  • 2014年04月09日 19:20
  • 1117

c++函数指针和返回值为指针的函数

1  指针的指针,数组指针 ,指针数组 2  函数指针 指针函数  3  const T   Tconst     T  f ()const      const  T f()...
  • qq_21034239
  • qq_21034239
  • 2017年04月13日 21:34
  • 499

[C/C++]如何解读返回函数指针的函数声明

int (*(*pf())())() { return nullptr; }   从来没有见过这样的函数声明。那么它究竟是一个怎样的函数呢?我努力回忆起《C专家编程》一书的内...
  • u012861978
  • u012861978
  • 2015年09月12日 09:43
  • 1028
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数返回指针类型、简单链表的应用
举报原因:
原因补充:

(最多只允许输入30个字)