2012-07-20 107 views
0

以下是Dijkstra最短路徑算法的代碼。該代碼在小輸入上工作正常,但我需要它爲200的2d數組大小。所以我使用動態內存分配。它仍然給出一個空指針分配錯誤。任何人都可以幫助我找到另一種讀取大尺寸二維數組的方法。空指針賦值錯誤。

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


void dij(int n,int v,int **c,int *d) 
{ 
    int i,u,count,w,f[300]; 
    int min; 

    for(i=1;i<=n;i++) 
    { 
     f[i]=0;d[i]=c[v][i]; 
    } 

    f[v]=1,d[v]=1; 

    count=2; 

    while(count<=n) 
    { 
     min=1000000; 
     for(w=1;w<=n;w++) 
      if((d[w]<min)&&!f[w]) 
      { 
       min=d[w];u=w; 
      } 
     f[u]=1; 
     count++; 

     for(w=1;w<=n;w++) 
      if(((d[u]+c[u][w])<d[w])&&!f[w]) 
       d[w]=d[u]+c[u][w]; 
    } 

} 


int main() 
{ 
    int v=1,n=4,i,j,k,len; 
    char str[20]; 
    int **c,*d,val; 

    d=(int*)malloc(n*sizeof(int)); 
    c=(int**)malloc(n*sizeof(int*)); 
    for(i=1;i<=n;i++) 
     c[i]=(int*)malloc(n*sizeof(int)); 

    for(i=1;i<=n;i++) 
     for(j=1;j<=n;j++) 
      c[i][j]=0; 
    for(k=0;k<=n;k++) 
    { 
     do 
     { 
      scanf("%s",&str); 
      len=strlen(str); 
      if(len>3) 
      { 
       sscanf(str,"%d,%d",&j,&val); 
       c[k][j]=val; 
      } 
      else break; 
     } 
     while(1); 
    } 

    for(i=1;i<=n;i++) 
     for(j=1;j<=n;j++) 
     { 
      if(c[i][j]==0) 
       c[i][j]=1000000; 
     } 

    printf("enter the source\n"); 

    scanf("%d",&v); 

    dij(n,v,c,d); 

    printf("shortest path from\n"); 

    for(i=1;i<=n;i++) 
     if(i!=v) 
      printf("%d -> %d=%d\n",v,i,d[i]); 
    getch(); 
} 

回答

2
for(i=1;i<=n;i++) 

數組索引從零開始。

+2

..和條件/測試通常只是「少」'< ',而不是「小於或等於」'<=' – Levon 2012-07-20 17:27:50

+0

@Levon,是的,這是開始爲'0'和長度爲'n' ;-) – 2012-07-20 17:28:59

+0

的邏輯結果,但他表示它適用於少量維度 – 2012-07-20 17:30:49

0

f是[300],您是否嘗試過298 299 300 301和302?所有相同或300,301,302是錯誤?

在函數DIJ(),最大值的i爲N,當設置大於300N的更大

,它給錯誤

int i,u,count,w,f[300]; // f[300]<---------constant size 
int min; 


    for(i=1;i<=n;i++) 

    { 
    f[i]=0;d[i]=c[v][i];// here i goes to n, while f[] is f[300] 

    }