2013-03-10 46 views
-2

我得到的是什麼使本作的問題,我只看到了作爲解釋這在C

for(i=0;nlist[i].nid!=0;i++) 
     {} 
     nlist[i].nid=n_id; 
     nlist[i].add=temp; 

NLIST是結構類型的數組

結構

struct node 
{ 
    int id; 
    struct node *l[MAX_CONN+1]; 
    int cost[MAX_CONN+1]; 
    struct node **next; 
    int *mincost; 

}; 
typedef struct node nodes; 
struct record 

{ 
    int nid; 
    struct node *add; 
}; 
typedef struct record records; 
records nlist[MAX_NODES+1]={0}; 
實施

全功能

FILE *f; 
    int d; 
    int i=0,j=0,n_id,n_cost; 
    nodes *temp=0,*temp1=0; 

    if((f=fopen("graph.txt","r"))== NULL) 
    { 
     printf("Error opening file.\n"); 
     exit(1); 
    } 
    memset(nlist, 0, sizeof(struct record) * MAX_NODES); 
    count=0; 
    do /*first get the id and address of all nodes*/ 
    { 
     fscanf(f,"%d",&n_id); 
     for(i=0;nlist[i].nid!=0;i++) 
     { 
      if(n_id==nlist[i].nid) 
      { 
       printf("Id already exists."); 
       return; 
      } 
     } 
     temp=(nodes *)malloc(sizeof(nodes)); 
     if (temp == 0) 
     { 
      printf("ERROR: Out of memory\n"); 
      return; 
     } 
     memset(temp, 0, sizeof(struct node)); 
     temp->id=n_id; 
     temp->l[MAX_CONN+1]=0; 
     temp->cost[MAX_CONN+1]=0; 
     for(i=0;nlist[i].nid!=0;i++) 
     {} 
     nlist[i].nid=n_id; 
     nlist[i].add=temp; 
     count++; 
     while((d=fgetc(f)!=';')) 
     {} 
    }while((d=fgetc(f))!=EOF); 

    rewind(f); 

    for(i=0;i<count;i++) /*now get the information of all nodes connections.*/ 
    { 
     fscanf(f,"%*d"); 

     temp=nlist[i].add; 
     while((d=fgetc(f)!=';')) 
     { 
      fscanf(f,"%d-%d",&n_id,&n_cost); 
      for(j=0;nlist[j].nid!=0;j++) 
      { 
       if(nlist[j].nid==n_id) 
       { 
        temp1=nlist[j].add; 
        break; 
       } 
      } 
      for(j=0;temp->cost[j]!=0;j++) 
      {} 
      temp->cost[j]=n_cost; 
      temp->l[j]=temp1; 
     } 
    } 
    fclose(f); 
+5

呃,什麼?........... – 2013-03-10 04:26:01

+0

什麼是nlist?結構體?聯盟? – Deepu 2013-03-10 04:30:18

回答

2

縮進是誤導。應縮進更多這樣的:

for(i=0;nlist[i].nid!=0;i++) { 
    /* empty loop */ 
} 
nlist[i].nid=n_id; 
nlist[i].add=temp; 

我認爲,它應該做的是如下:for循環推進從0 i,直到找到具有空值,其nid領域nlist元素。然後它將該索引處的nidadd字段分別設置爲n_idtemp

我應該補充說這是非常危險的代碼。如果inlist的末尾前進,但未找到合適的位置,則該程序很可能會崩潰或以其他方式行事不當。它當然不會表現正確。

+0

更有可能這些語句應該在循環中!但是考慮到使用i的循環終止條件,無論如何它都沒有多大意義。 – 2013-03-10 04:28:55

+0

@MitchWheat - 這個或者一些評論會大大提高可讀性。我的首選是將'for'移動到一個有意義名稱的函數中(例如,'findFirstAvailableSlot()'返回一個索引(如果沒有可用的話,則返回-1) – 2013-03-10 04:31:22

+1

我的偏好是挖一個大洞,把代碼放入它!:) – 2013-03-10 04:32:17