www.pudn.com > jlly.rar > jlly.c


                                     /*Routine.c    TC2.0 WinXp*/ 
#include  
#include  
#include  
#define ROUTNUM 7 
 
typedef struct 
{ 
  int dis; 
  int from; 
}RoutNode; 
 
RoutNode data[ROUTNUM][ROUTNUM];/*路由表*/ 
 
void InitData(FILE* pfile);/*从数据文件读取数据,初始化路由表*/ 
void OutputRoutData();/*输出所有的路由表*/ 
void Communication(int recv, int send);/*send点向recv点发送自己的路由表*/ 
void Exchange();/*所有节点进行一次数据交换,更新路由表*/ 
 
void main() 
{ 
  int start,end; 
  int i; 
  FILE *pfile; 
  pfile = fopen("data.txt", "r"); 
  if (pfile == NULL) 
  { 
    printf("data file failed to open, press any key to quit.\n"); 
    getch(); 
    return; 
  } 
  else 
    InitData(pfile); /*初始化数据*/ 
  fclose(pfile); 
  printf("\nInitial State:\n"); 
  OutputRoutData();/*输出初始路由表*/ 
  for (i=0; i6 || end<0 || end>6) 
  { 
    printf("\nwrong input, press any key to quit.\n"); 
    getch(); 
    return; 
  } 
  else 
  { 
   int cur = start; 
   int total = 0; 
   if (data[start][end].dis < 0) /*判断输入的起始点与结束点的距离是否为为零*/ 
   { 
    printf("No routine find!\n"); 
    getch(); 
    return; 
   } 
 
   printf("%c->", cur+65);       /*将十进制数转换成对应的字母*/ 
   while (data[cur][end].from >= 0)/*当输入的两点之间的距离大于等于零时找到最佳路径并打印*/ 
   { 
    total += data[cur][data[cur][end].from].dis; 
    printf("%c->",data[cur][end].from+65); 
    cur = data[cur][end].from; 
   } 
   total += data[cur][end].dis; 
   printf("%c\ntotal distance=%d", end+65, total); 
   getch(); 
   return; 
  } 
} 
 
void InitData(FILE* pfile) 
{ 
  char num[10]; 
  int i=0; 
  char c; 
  int m,n; 
  fseek(pfile, 0, 0); 
  for (m=0; !feof(pfile)&&m<7; m++) 
  { 
    for (n=0; !feof(pfile)&&n<7; n++) 
    { 
      while (!feof(pfile))  /*判断是否文件尾,不是则循环*/ 
      { 
        c = fgetc(pfile);  /*读出数据送入缓冲区*/ 
        if (c==',')         /*读完一个数字*/ 
        { 
          num[i] = '\0'; 
    data[m][n].dis = atoi(num); 
    data[m][n].from = -1; 
          i = 0; 
          break; 
        } 
        else if ((c>='0' && c<='9') || c=='-')/*如果读到数字或符号*/ 
        { 
          num[i++] = c; 
        } 
      } 
    } 
  } 
} 
 
void OutputRoutData()   /*输出函数*/ 
{ 
 int i,j; 
 printf("   "); 
 for(i=0; i 0)/*如果send节点到i号节点有路线*/ 
  { 
   if (data[recv][i].dis < 0)/*如果recv到i号节点无路径*/ 
   { 
    data[recv][i].dis = data[send][i].dis + data[recv][send].dis; 
    data[recv][i].from = send; 
   } 
   else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis)/*如果现有路径比新路径远*/ 
   { 
    data[recv][i].dis = data[send][i].dis + data[recv][send].dis; 
    data[recv][i].from = send; 
   } 
  } 
 } 
} 
 
void Exchange() 
{ 
 int i,j; 
 for (i=0; i 0)/*如果两个节点之间有路径*/ 
   { 
    Communication(j,i);/*将i号节点的路由表发送给j号节点*/ 
   } 
  } 
 } 
}