2015-11-07 59 views
1

我正在嘗試製作一個節點數組,並從S []數組中輸入值。但我不斷收到分段錯誤。 我的結構是這樣的:鏈接列表中的數組在C中無法正常工作

typedef struct Node { 
int num; 
struct Node *next; 
}ListNode; 

S [10]初始化數組隨機數:

printf("list is:"); 

    for(i=0;i<10; i++) 
    { 
      RN= (random()+1); 
      S[i]=RN; 
      printf("%d ",S[i]); 
    } 
    printf("\n"); 

這是我如何初始化我的節點陣列:

ListNode *bucket[Radix]; 
    for(j=0; j<Radix; j++) 
     { 
      bucket[i]=(ListNode*)malloc(sizeof(ListNode)); 
      bucket[i]->next=NULL; 
     } 

而且這是我用來從S []讀取數組數字的函數到鏈表,數組bucket []中:

 for(y=0;y<(sizeof(S)/sizeof(int));y++) // S is size of a normal array 
     { 
      digit=bucketNumber(S[y],1);// returns the first digit values 
      pointer= bucket[digit]; 
      number= S[y]; 
      insert_tail(pointer, number); 
     } 

我insert_tail功能是這樣的:

ListNode *insert_tail(ListNode *tail, int data) 
    // insert and element at tail 

    { 

    if (tail==NULL) 
    { tail=(ListNode *)malloc(sizeof(ListNode));} 

    else 
    { 
     while(tail->next !=NULL) 

     tail->next = (ListNode *)malloc(sizeof(ListNode)); 
     tail= tail->next; 
    } 

    tail->num= data; 
    tail->next=NULL; 
    } 

這是bucketNumber功能:

int bucketNumber(int num,int digit) 
    { 
    int x, y; 
    y= 10*digit; 
    x= num%y; 

    if(digit>=2) 
    { 
     num= num%y; 
     x= num/(y/10); 
    } 
    return (x); 

}

我認爲段錯誤的原因是,我的功能也沒有創造數組中的鏈接正確。我不確定你是否會有其他錯誤!

+1

在調試器中運行您的程序。 – kaylum

+0

要稍微擴展kaylum的觀點,使用調試器運行程序通常很簡單,這樣當發生seg故障時,您可以清楚地看到它發生了什麼行。考慮到這一點,你可能會或可能不會顯示所有相關的代碼(儘管在那裏做了很多努力),但人們可能無法幫助你。如果您需要幫助確定seg-fault行,請發表評論與您的​​開發環境細節。 –

+0

我正在研究宙斯。另外,我只是使用調試器,它在insert_tail函數中指出了一個錯誤。我試圖修復它,但它仍然無法正常工作。 – Sarah

回答

2

我認爲這個問題是在insert_tail()本節:

else 
    { 
     while(tail->next !=NULL) 

     tail->next = (ListNode *)malloc(sizeof(ListNode)); 
     tail= tail->next; 
    } 

    tail->num= data; 
    tail->next=NULL; 

由於while()循環沒有跟隨它花括號,下面的線被執行,當且僅當tail->next != NULL

tail->next = (ListNode *)malloc(sizeof(ListNode)); 

......這與你想要的相反;如果nextNULL,您希望爲next分配新節點。原因是,next很可能是NULL,因此tail被轉移到next,但next未分配 - 它是NULL。在這種情況下,上面的底部兩行都會導致分段錯誤,因爲您不能取消引用NULL指針,這是->正在執行的操作。

+0

哦,我明白了!謝謝。 :) – Sarah