虚心请问一个入门级的有关问题

虚心请教一个入门级的问题
初次发帖 请多多指教
刚刚接触c语言 现在碰到个难题 做了几天还是没做出来 特来请教各位大侠~

有一个文本文件 data.txt

4
BUR
LAX
SFO
SMO
  0 150 80 50
150 0 0 0
 80 0 0 229
 50 0 229 0 

其中字母代表机场缩写,数字为机票价钱 要求是在CMD里显示:
1.完整的机场与机票价钱对照表格,如下图
  | BUR LAX SFO SMO
--- --- --- --- ---
BUR | 0 150 80 50
LAX | 150 0 0 0
SFO | 80 0 0 229
SMO | 50 0 229 0

2.统计每个机场能去的地点,如下图
BUR (3): LAX, SFO, SMO
LAX (1): BUR
SFO (2): BUR, SMO
SMO (2): BUR, SFO

3.列出每个机场分别能到哪个目的地(不重复,例如有了BUR - LAX,就不用LAX - BUR)如下图
BUR - LAX
BUR - SMO
BUR - SFO
SFO – SMO

4.列出每个机场最便宜的机票,如下图
BUR -> SMO 50
LAX -> BUR 150
SFO -> BUR 80
SMO -> BUR 50

绞尽脑汁只憋出了这么点代码,请各位大侠帮帮忙~~ 在线等~~ 只剩15个小时了

C/C++ code

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *stream=NULL;
    int TableArray[4][4];
    char ch;
    int i,j,size;
    stream=fopen("airports.txt","r");
    if( stream == NULL )
    {
        printf( "The file airports.txt was not opened\n" );
    }
    else
    {
        fscanf(stream,"%d",&size);
       /*do
    {
    ch = getc(stream);
    if (ch!=EOF);
        //printf("%c",ch);
    }while (ch!=EOF);*/

    for(i=0;i<size;i++)
        {
            for(j=0;j<size;j++)
            {
                fscanf(stream,"%d",&TableArray[i][j]);
            }
        }
    }
    /*===== print array =====*/
    for(i=0;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            printf("%4d",TableArray[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}



------解决方案--------------------
我觉得 你把你不明白的问题说出来 大家帮你比较好,如果全部给你代码,你学到的其实很少。
不知你怎么认为?
如伤害到你,请谅解。
------解决方案--------------------
C/C++ code
#define MAXN 1000
char nm[MAXN][4];//约定机场名3个英文字母
int TableArray[MAXN][MAXN];
……
 fscanf(stream,"%d",&size);
 if (size<2 || size>MAXN) return 1;
 for (i=0;i<size;i++) fscanf(strean,"%3s",nm[i]);
 for(i=0;i<size;i++) {
  for(j=0;j<size;j++) {
   fscanf(stream,"%d",&TableArray[i][j]);
  }
 }
 printf("   |");
 for(i=0;i<size;i++) printf("%4s",nm[i]);
 printf("\n");
 printf("---| --- --- --- ---\n");
 for(i=0;i<size;i++) {
  printf("%3s|",nm[i]);
  for(j=0;j<size;j++) {
   printf("%4d",&TableArray[i][j]);
  }
  printf("\n");
 }

------解决方案--------------------
这个是完整的程序了。
C/C++ code

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

int read_data(char ***names, int **array)
{
    int  i, j, len;
    int  count;
    char buf[1024];

    fgets(buf, sizeof(buf), stdin);
    count = atoi(buf);
    (*names) = malloc(sizeof(char *) * count);
    (*array) = malloc(sizeof(int) * count * count);
    for (i = 0; i < count; i++) {
        fgets(buf, sizeof(buf), stdin);
        len = strlen(buf);
        if (len > 1 && (buf[len - 1] == '\r' || buf[len - 1] == '\n'))
            buf[len - 1] = '\0';
        len = strlen(buf);
        if (len > 1 && (buf[len - 1] == '\r' || buf[len - 1] == '\n'))
            buf[len - 1] = '\0';
        (*names)[i] = strdup(buf);
    }

    for (i = 0; i < count; i++)
        for (j = 0; j < count; j++)
            scanf("%d", &(*array)[i * count + j]);

    return count;
}

void show_data(int count, char **names, int *array)
{
    int i, j;

    printf("    |");
    for (i = 0; i < count; i++)
        printf(" %s", names[i]);
    printf("\n---   --- --- --- ---\n");

    for (i = 0; i < count; i++) {
        printf("%s |", names[i]);
        for (j = 0; j < count; j++) 
            printf(" %3d", array[i * count + j]);
        printf("\n");
    }
}

void show_each(int count, char **names, int *array)
{
    int i, j, len;
    int nreach;
    char *sreach;

    sreach = malloc((strlen(names[0]) + 2) * 3 + 1);
    for (i = 0; i < count; i++) {
        nreach = 0;
        sreach[0] = '\0';
        len = 0;
        for (j = 0; j < count; j++) {
            if (array[i * count + j] > 0) {
                nreach++;
                len += sprintf(sreach + len, "%s, ", names[j]);
            }
        }
        if (len > 0)
            sreach[len - 2] = '\0';
        printf("%s (%d): %s\n", names[i], nreach, sreach);
    }

    free(sreach);
}

void show_path(int count, char **names, int *array)
{
    int i, j;

    for (i = 0; i < count; i++)
        for (j = i; j < count; j++)
            if (array[i * count + j] > 0)
                printf("%s - %s\n", names[i], names[j]);
}

void show_cheap(int count, char **names, int *array)
{
    int i, j;
    int m;

    for (i = 0; i < count; i++) {
        m = 0;
        for (j = 0; j < count; j++)
            if ((array[i * count + j] > 0 &&
                 (array[i * count + j] < array[i * count + m]
                 || array[i * count + m] == 0)
                ))
                m = j;
        printf("%s -> %s %d\n", names[i], names[m], array[i * count + m]);
    }
}

int main(int argc, char *argv[])
{
    int i, j, count;
    int *array;
    char **names;

    count = read_data(&names, &array);
    show_data(count, names, array);
    show_each(count, names, array);
    show_path(count, names, array);
    show_cheap(count, names, array);

    return 0;
}