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

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

#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_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]));

return 1;
} // end shutdown
//
FD *Create_Fd_Pos(void )
{
temp_fd = curr_fd = head_fd = NULL;
temp_fd = (FD *)malloc(sizeof(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

} // end create_fd_pos

//
FD *Create_Fd_Pos_Array1(void )
{
temp_fd = curr_fd = head_fd = NULL;
temp_fd = (FD *)malloc(sizeof(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

} // end Create_Fd_Pos_Array1

//
FD *Create_Fd_Pos_Array2( int n )
{
temp_fd = curr_fd = head_fd = NULL;
temp_fd = (FD *)malloc(sizeof(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

} // end Create_Fd_Pos_Array2

int Main_Program(void)
{
/*
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
*/

for (int a=0;a<10;a++)
{
break;
} // 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
temp_trace_fd = (TRACE_FD *)malloc(sizeof(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

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

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

} // END Trace_FD

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

Main_Program();

Shutdown();

return 0;
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：函数返回指针类型、简单链表的应用 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)