c++zuoye

来源:互联网 发布:ajax get传json 编辑:程序博客网 时间:2024/04/28 10:18

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

#define INT1  char  
#define UINT1 unsigned char
#define UINT2 unsigned short
#define UINT4 unsigned long
#define ___swab16( X )   ((UINT2)((((UINT2)( X ) & (UINT2)0x00ffU) << 8) |(((UINT2)( X ) & (UINT2)0xff00U) >> 8) ))

#define ___swab32( X )    ((UINT4)((((UINT4)(X ) & (UINT4)0x000000ffUL) << 24)|(((UINT4)(X ) & (UINT4)0x0000ff00UL) <<  8) |(((UINT4)(X ) & (UINT4)0x00ff0000UL) >>  8) |(((UINT4)(X ) & (UINT4)0xff000000UL) >> 24) ))
#define M03(X)              ( (X)&0x0000000fUL)//Class番号
#define M46(X)              (( (X)&0x00000070UL)>>4)//岔路数
#define M7(X)               (( (X)&0x00000080UL)>>7)//有无路线
typedef struct NODE
{

 UINT2 LinkSize;
 UINT4 LinkId;
 UINT2 LinkNameSize;
 UINT4 LinkBeginEndInfo;
 INT1 *LinkName;
 struct NODE *next;
}L_NODE;

//查找指定 交叉Link列表示Class番号 的所有Link的集合。
//查找岔路数> n 的所有Link的集合, n由用户输入。
//指定道路名称检索。
//#linked=1234;roadnameflag=1;brunch=2;dispclass=3; roadname=青年大街#
//(如果没有名称(roadnameflag == 0 ), 则不输出roadname=青年大街这个条目)
//如果查到的纪录的个数>5个,则输出到指定文件中(文件放在当前目录中,请用 searchresultxxx.txt 命名, xxx是检索次数的记录,比如第一次检索,则xxx是 001, 以此类推。)
void print(L_NODE *head);
void find_name(L_NODE *head, INT1 *str);
void find_class(L_NODE *head, int m_class);
void find_x(L_NODE *head, int m_x);
void findid(L_NODE *head, int *id);
void sort1(L_NODE *head );
void insexinfo(L_NODE *head, L_NODE *m_inset);
void print_fwrite(L_NODE *head);
void print(L_NODE *LinkInfo)
{
 printf("#linked= %u;",LinkInfo->LinkId);
 printf("roadnamefla= %d;",M7(LinkInfo->LinkBeginEndInfo));
 printf("brunch= %d ;",M03(LinkInfo->LinkBeginEndInfo));
 if(LinkInfo->LinkName != NULL)
 {
  
  printf("roadname=");
  printf("%s/n",LinkInfo->LinkName);

 }
 else
 {
  printf("no road name message/n");
 }
}
void print_fwrite(L_NODE *head)
{
       
 FILE *F1 = fopen("5.txt","wb");
 L_NODE *q;
 for(q = head; q != NULL; q = q->next)
 {

      fwrite(&(q->LinkSize),sizeof(UINT2),1,F1);
   fwrite(&(q->LinkId),sizeof(UINT4), 1, F1);
   fwrite(&(q->LinkNameSize), sizeof(UINT2), 1, F1);
   fwrite(&(q->LinkBeginEndInfo), sizeof(UINT4), 1, F1);
   if(q->LinkName != NULL)
   {
                fwrite(q->LinkName,  q->LinkSize-(UINT2)12 ,1, F1);
   }
   else
   {
    //fwrite("no road name message",1,strlen("no road name message"),F1);
   }


  
 }
 fclose(F1);
}


void insexinfo(L_NODE *head, L_NODE *m_inset)
{
  
 L_NODE *q, *p,*r;
 r = head;
 p = head;
 for(q = head; q != NULL; q = q->next)
 {  
  if(q->LinkId != m_inset->LinkId)
  {
   p = p->next;
   
  }
 }
 if(p ==NULL)
 {
  m_inset->next = q;
  q = m_inset;
 }
    while(r != NULL)
 {
        print(r);
  r = r->next;
 }
 
}
void find_name(L_NODE *head, INT1 *str)
{
 L_NODE *q;
 for(q = head; q != NULL; q = q->next)
 {
  if(q->LinkName != NULL)
  {
   if(strcmp(q->LinkName, str) == 0)
   {
    print( q );

   }
   else
   {
    //printf("not the name");
   }
  }
  else
  {

  }
 }

}
void find_class(L_NODE *head, int m_class)
{

 L_NODE *q;
 for(q = head; q != NULL; q = q->next)
 {
  if((M03(q->LinkBeginEndInfo)) >= m_class)
  {
   print(q );

  }
 }


}

void find_x(L_NODE *head, int m_x)
{
 L_NODE *q;
 for(q = head; q != NULL; q = q->next)
 {
  if((M46(q->LinkBeginEndInfo)) >= m_x)
  {
   print( q );
  }
 }

}
void findid(L_NODE *head, int *id)
{
 FILE *F1 = fopen("3.txt","wb");
 L_NODE *q;
 for(q = head; q != NULL; q = q->next)
 {
  if(q->LinkId == id)
  {
   print(q );
           
   fwrite(&(q->LinkSize),sizeof(UINT2),1,F1);
   fwrite(&(q->LinkId),sizeof(UINT4), 1, F1);
   fwrite(&(q->LinkNameSize), sizeof(UINT2), 1, F1);
   fwrite(&(q->LinkBeginEndInfo), sizeof(UINT4), 1, F1);
   if(q->LinkName != NULL)
   {
    
    fwrite(q->LinkName,  q->LinkSize-(UINT2)12 ,1, F1);
   }
   else
   {
    //fwrite("no road name message",1,strlen("no road name message"),F1);
   }

   
  }
 }
 fclose(F1);
}

 


void sort1(L_NODE *head )
{
 L_NODE *p, *q, *t, *small;
  FILE *F1 = fopen("5.txt","wb");

 int count;
 int i=0;
    printf("%u/n",head->LinkId);
 for(p = head; p->next != NULL; p = p->next )
 {
 
  small = p;
  for(q = p->next; q != NULL; q = q->next)
  {
   if(q->LinkId < small->LinkId)
   {
    small = q;
   }
  }
   // exit(1);
  fwrite(&(small->LinkSize),sizeof(UINT2),1,F1);
  fwrite(&(small->LinkId),sizeof(UINT4), 1, F1);
  fwrite(&(small->LinkNameSize), sizeof(UINT2), 1, F1);
  fwrite(&(small->LinkBeginEndInfo), sizeof(UINT4), 1, F1);
  if(small->LinkName != NULL)
  {
   fwrite(small->LinkName,  small->LinkSize-(UINT2)12 ,1, F1);
  }
  else
  {
   //fwrite("no road name message",1,strlen("no road name message"),F1);
  }
         


 }
 
 fclose(F1);
  
}

int main()
{  
 UINT1 str1[6500]="no road name";
 UINT1 str[6500];
 int m_class;
 int m_x;
 UINT4 id;
 int i,j;
 int LinkIdA[70000]={0};
    int count = 0;
 FILE *F;

 L_NODE *LinkInfo, *Head, *rear, *p, *q;
 L_NODE *m_inset;
    Head = NULL;
    rear = NULL;

 F = fopen("c://gtbl.dat","rb");

 while(!feof(F))
 {
      
        LinkInfo = (L_NODE *)malloc(sizeof(L_NODE));
     LinkInfo->LinkName = NULL;
  if(LinkInfo == NULL)
  {
   printf("no memory");
   exit(1);
  }
  else
  {

 
   fread(&(LinkInfo->LinkSize),sizeof(UINT2),1,F);
   fread(&(LinkInfo->LinkId),sizeof(UINT4), 1, F);
   fread(&(LinkInfo->LinkNameSize), sizeof(UINT2), 1, F);
   fread(&(LinkInfo->LinkBeginEndInfo), sizeof(UINT4), 1, F);

   LinkInfo->LinkSize = ___swab16(LinkInfo->LinkSize);

   //printf("%d",LinkInfo->LinkSize);
  
   LinkInfo->LinkId = ___swab32(LinkInfo->LinkId);


   LinkInfo->LinkNameSize = ___swab16(LinkInfo->LinkNameSize);

   LinkInfo->LinkBeginEndInfo = ___swab32(LinkInfo->LinkBeginEndInfo);
           
   if((M7(LinkInfo->LinkBeginEndInfo) == 1)&&LinkInfo->LinkSize<100)
   {
    LinkInfo->LinkName = (INT1 *)malloc(LinkInfo->LinkNameSize);
    assert(LinkInfo->LinkName);
    fread(LinkInfo->LinkName,  LinkInfo->LinkSize-(UINT2)12 ,1, F);
   }
   else
   {
    
   }
      print( LinkInfo );
  

   LinkInfo->next = NULL;

   if(Head == NULL)
   {
    Head = LinkInfo;
    rear = LinkInfo;

   }
   else
   {
    rear->next = LinkInfo;
                rear = LinkInfo;

   }
  // printf("%u",Head->LinkId);
  // exit(1);
  
  
  }

   
 }
 
 p = Head;
 /*while(p != NULL)
 {
  printf("%u /t",p->LinkId);
  p = p->next;
  count++;
 }*/

 printf("%d/n",count);
 printf("input id/n");
 scanf("%u", &id);
    findid(Head, id);
 printf("/n");

  printf("input M46(X) 岔路数 m_x/n");
  scanf("%d", &m_x);
  find_x(Head,  m_x);
  printf("/n");
    
  printf("input M03(X) Class番号 m_class/n");
  scanf("%d", &m_class);
     find_class(Head,  m_class);
  printf("/n");
     printf("print_fwrite");
  print_fwrite(Head);
    
  printf("input m_name/n");
  scanf("%s", str);
  find_name(Head, str);
  printf("/n");


     m_inset = (L_NODE *)malloc(sizeof(L_NODE));
 

  printf("input m_inset LinkSize/n");
  scanf("%u",&(m_inset->LinkSize));

  printf("input m_inset linkid/n");
  scanf("%u",&(m_inset->LinkId));

     printf("input m_inset LinkNameSize/n");
  scanf("%u",&(m_inset->LinkNameSize));

   printf("input m_inset LinkBeginEndInfo/n");
  scanf("%u",&(m_inset->LinkBeginEndInfo));
  if((m_inset->LinkSize > 12)&&(m_inset->LinkSize<100))
  {
   m_inset->LinkName = (INT1 *)malloc(m_inset->LinkNameSize);
   printf("input m_insert>linkname/n");
   scanf("%s",str1);
   strcpy(m_inset->LinkName, str1);
  }
  else
  {

  strcpy(m_inset->LinkName,str1);
  }


 insexinfo( Head,m_inset);
 printf("正在排序/n");
 sort1( Head );
 printf("排序结束/n");
 fclose(F);
 

 while(Head)
 {
  L_NODE *p = Head;
  Head = Head->next;//下一个
  free(p->LinkName);
  free(p);//释放
 }

 return 0;
}

 

原创粉丝点击