//主要问题在getcar_single函数里,建立链表只建立两组就报错了,有没有大神知道咋回事

#include<stdio.h>
#include<stdlib.h>
#define ROW 30//行
#define COL 40//列
#define ROWS 10//小矩阵行
#define NUM  (ROW/ROWS)  //小矩阵循环次数

int *getbuf(int *p,int a);
int *getchangdiwh(int *p);
int getchangdih(int *p);
void getcar_single(int *pt,int *a,int c,int d);
int getthing(struct center *pp,int i);

struct center
{
	int thing;
	int x;
	int y;
	struct center *next;
};

int main()
{
	int buf_img[ROW*COL]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};


    int i; 
	int buf_w[2]={0};
    int h;
	int *p=NULL,*pt=NULL,*a=NULL;
  	p=&buf_img[0];
	for(i=0;i<NUM;i++)
	{
		//*(a+0)为场地左边界
		//*(a+1)为场地右边界
		//*(a+2)为场地上边界
		//h为场地下边界

		pt=getbuf(p,i);
		if(i==0)
		{
			a=getchangdiwh(pt);
			getcar_single(pt,a,i,0);

		}
		else if(i==NUM-1)
		{
			h=getchangdih(pt);
				//+ROWS*i;
			//printf("h=%d\n",h);
			getcar_single(pt,a,i,h);
		}
		else 
		{
			getcar_single(pt,a,i,0);
		}
	

	}
	
	printf("w1=%d,w2=%d,h1=%d,h2=%d\n",*(a+0),*(a+1),*(a+2),h);


}

int *getbuf(int *p,int a)
{
	static int buf[ROWS][COL]={0};//要处理 的小矩阵
	int i;
	int *pt=NULL;
	
	for(i=0;i<ROWS*COL;i++)
	{
		buf[i/COL][i%COL]=*(p+i+a*ROWS*COL);
	}
	pt=&buf[0][0];
	return pt;

}



int *getchangdiwh(int *p)
{
	static int buf_wh[3];
    int i,j,a=0,b=0,c=0;
	int *pt=NULL;
	pt=&buf_wh[0];
	for( i=0;i<ROWS;i++)
	{	
		for( j=0;j<COL;j++)
		{
			if(j>0)
			{
				if(*(p+(j+COL*i))-*(p+(j+COL*i-1))<0&&j<COL/5)
				{	
					a=j;  
				}
				if(*(p+(j+COL*i))-*(p+(j+COL*i-1))>0&&j>(COL/5)*4)
				{
					b=j;
				}
				if(b-a>COL*0.858&&c==0)
				{
		        	buf_wh[0]=a;
		        	buf_wh[1]=b-1;
					buf_wh[2]=i;
					c++;
				}		
			}			
		}
	}
//	printf("%d,%d\n%d\n",buf_wh[0],buf_wh[1],buf_wh[2]);
	return pt;
}

int getchangdih(int *p)
{	
	int i,j,a=0,b=0,c=0,d=0;
	for( i=0;i<ROWS;i++)
	{	
		for( j=0;j<COL;j++)
		{
			if(j>0)
			{
				if(*(p+(j+COL*i))-*(p+(j+COL*i-1))<0&&j<COL/5)
				{	
					a=j;  
				}
				if(*(p+(j+COL*i))-*(p+(j+COL*i-1))>0&&j>(COL/5)*4&&*(p+j+COL*i-4)==0)
				{
					b=j;
				}
				if(b-a>COL*0.858&&c==0)
				{
		        	d=i;
					c++;
				}		
			}			
		}
	}
	//printf("%d\n",d);
	return d;
}

void getcar_single(int *pt,int *wh,int c,int d)
{
	int i,j,a,b,m,n;
	int bufw[30];
	int bufh[30];
	struct center *head,*p1,*h;
	int car=0,single1=0,single2=0,single3=0,single4=0,single5=0;
	int car_sumw=0,car_sumh=0,single1_sumw=0,single1_sumh=0,single2_sumw=0,single2_sumh=0,single3_sumw=0,single3_sumh=0,single4_sumw=0,single4_sumh=0,single5_sumw=0,single5_sumh=0;
	int car_avgw=0,car_avgh=0,single1_avgw=0,single1_avgh=0,single2_avgw=0,single2_avgh=0,single3_avgw=0,single3_avgh=0,single4_avgw=0,single4_avgh=0,single5_avgw=0,single5_avgh=0;
	head=(struct center*)malloc(sizeof(struct center));
	head->next=NULL;
	p1=(struct center*)malloc(sizeof(struct center));
	p1->next=NULL;
	for(i=0;i<ROWS;i++)
	{
		for(j=0;j<COL;j++)
		{
		  if(c==0)
		  {
			if(i>(*(wh+2)+3)&&j>(*(wh+0)+3)&&j<(*(wh+1)-3))
			{	
				if(*(pt+(j+COL*i))-*(pt+(j+COL*i)-1)<0)//场地里面
				{
				    a=0;
					b=0;
					do
					{
						bufw[a]=j+a;
						bufh[a]=i;			
						++a;			
					}while(*(pt+(j+COL*i+a))==0);
					if(a>3)
					{

						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));						
					}
					else if(*(pt+j+COL*(i+1))==0&&*(pt+j+COL*(i+2))==0&&*(pt+j+COL*(i+3))==0)
					{
						
						//&&*(pt+j+COL*(i+4))==0&&*(pt+j+COL*(i+5))==0&&*(pt+j+COL*(i+6))==0
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
				     	p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}
					else if(*(pt+j+COL*(i-1))==0&&*(pt+j+COL*(i-2))==0&&*(pt+j+COL*(i-3))==0)
					{
					
						//&&*(pt+j+COL*(i-4))==0&&*(pt+j+COL*(i-5))==0&&*(pt+j+COL*(i-6))==0
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}
					else 
					{
					
						for(m=0;m<a;m++)
							b=b+bufw[m];
						n=getthing(h->next,i);//区分信标
						p1->thing=n;
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}	
				}
			} 
		  }
		  else if(c==NUM-1)
		  {
			if(i<d-3&&j>(*(wh+0)+3)&&j<(*(wh+1)-3))
			{	
				if(*(pt+(j+COL*i))-*(pt+(j+COL*i)-1)<0)//场地里面
				{
				    a=0;
					b=0;
					do
					{
						bufw[a]=j+a;
						bufh[a]=i;			
						++a;			
					}while(*(pt+(j+COL*i+a))==0);
					if(a>3)
					{
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));	
					}
					else if(*(pt+j+COL*(i+1))==0&&*(pt+j+COL*(i+2))==0&&*(pt+j+COL*(i+3))==0)
					{	
						//&&*(pt+j+COL*(i+4))==0&&*(pt+j+COL*(i+5))==0&&*(pt+j+COL*(i+6))==0
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
				     	p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}
					else if(*(pt+j+COL*(i-1))==0&&*(pt+j+COL*(i-2))==0&&*(pt+j+COL*(i-3))==0)
					{
					
						//&&*(pt+j+COL*(i-4))==0&&*(pt+j+COL*(i-5))==0&&*(pt+j+COL*(i-6))==0
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}
					else 
					{
					
						for(m=0;m<a;m++)
							b=b+bufw[m];
						n=getthing(h->next,i);//区分信标
						p1->thing=n;
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}	
				}
			} 
		  }
		  else
		  {
			if(j>(*(wh+0)+3)&&j<(*(wh+1)-3))
			{	
				if(*(pt+(j+COL*i))-*(pt+(j+COL*i)-1)<0)//场地里面
				{
				    a=0;
					b=0;
					do
					{
						bufw[a]=j+a;
						bufh[a]=i;			
						++a;			
					}while(*(pt+(j+COL*i+a))==0);
					if(a>3)
					{

						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
						
					}
					else if(*(pt+j+COL*(i+1))==0&&*(pt+j+COL*(i+2))==0&&*(pt+j+COL*(i+3))==0)
					{
						
						//&&*(pt+j+COL*(i+4))==0&&*(pt+j+COL*(i+5))==0&&*(pt+j+COL*(i+6))==0
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
				     	p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}
					else if(*(pt+j+COL*(i-1))==0&&*(pt+j+COL*(i-2))==0&&*(pt+j+COL*(i-3))==0)
					{
					
						//&&*(pt+j+COL*(i-4))==0&&*(pt+j+COL*(i-5))==0&&*(pt+j+COL*(i-6))==0
						for(m=0;m<a;m++)
						{
							b=b+bufw[m];
						}
						p1->thing=0;//标志车
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}
					else 
					{
					
						for(m=0;m<a;m++)
							b=b+bufw[m];
						n=getthing(head->next,i);//区分信标
						p1->thing=n;
						p1->x=b/a;
						p1->y=i;
						p1->next=head->next;
						head->next=p1;
						p1=(struct center*)malloc(sizeof(struct center));
					}	
				}
			} 
		  }
		}
	}
	head=head->next;
	while(head)
	{
		if(head->thing==0)
		{   car++;
			car_sumw=car_sumw+head->x;
			car_sumh=car_sumh+head->y;			
		}
		else if(head->thing==1)
		{   single1++;
			single1_sumw=single1_sumw+head->x;
			single1_sumh=single1_sumh+head->y;
		}
		else if(head->thing==2)
		{   single2++;
			single2_sumw=single2_sumw+head->x;
			single2_sumh=single2_sumh+head->y;
		}
		else if(head->thing==3)
		{   single3++;
			single3_sumw=single3_sumw+head->x;
			single3_sumh=single3_sumh+head->y;
		}
		else if(head->thing==4)
		{   single4++;
			single4_sumw=single4_sumw+head->x;
			single4_sumh=single4_sumh+head->y;
		}
		else if(head->thing==5)
		{   single5++;
			single5_sumw=single5_sumw+head->x;
			single5_sumh=single5_sumh+head->y;
		}

		printf("%d__%d__%d\n",head->thing,head->x,head->y);
		head=head->next;
	}
	car_avgw=car_sumw/car;
	car_avgh=car_sumh/car;

	single1_avgw=single1_sumw/single1;
	single1_avgh=single1_sumh/single1;

	single2_avgw=single2_sumw/single2;
	single2_avgh=single2_sumh/single2;

	single3_avgw=single3_sumw/single3;
	single3_avgh=single3_sumh/single3;

	single4_avgw=single4_sumw/single4;
	single4_avgh=single4_sumh/single1;

	single4_avgw=single4_sumw/single4;
	single4_avgh=single4_sumh/single4;

	printf("车的中心坐标:(%d,%d)\n",car_avgw,car_avgh);
	printf("信标1的中心坐标:(%d,%d)\n",single1_avgw,single1_avgw);
	printf("信标2的中心坐标:(%d,%d)\n",single2_avgw,single2_avgw);
	printf("信标3的中心坐标:(%d,%d)\n",single3_avgw,single3_avgw);
	printf("信标4的中心坐标:(%d,%d)\n",single4_avgw,single4_avgw);
	printf("信标5的中心坐标:(%d,%d)\n",single5_avgw,single5_avgw);

}


int getthing(struct center *pp,int i)
{
	static int n=6;
	int a=0,b=0;
	while(pp)
	{
		if(pp->thing ==0)
		{
			a=pp->thing; 
			pp=pp->next;
		}
	 	else if(i-pp->y<6&&i-pp->y>-6)
		{
			n=pp->thing;									
			break;	
		}
		else
		{
			a=pp->thing;
			pp=pp->next;
		}
		if(a>b)
		{
			b=a;
		}
	}		
	if(n==6)
	{
		n=b+1;
	}	
	return n;
}