2014-01-17 60 views
0

不工作我是C語言的情況,我有結構如下圖下:while循環如預期在C

struct afreq 
{ 
    unsigned char sym; 
    int freq;   
    short int left,right;  
}; 
struct afreq data[512] ; 

編寫的代碼的編譯後形成這種類型的結構:

[a 0 0 0] 
[b 1 0 0] 
[z 1 b a] 
[c 2 0 0] 
[d 3 0 0] 
[z 3 c z] 
[e 4 0 0] 
[z 6 z d] 
[z 10 z e] 

是第一個元件是「SYM」第二個是「頻率」和第三是「左」和第四是「正確的」。

現在我要做的是:

從最後一個元素開始(這是[Z 10 Z E - ])我必須去所有這些元素,其「左」和「右」均爲零。我還必須計算它們與最右邊元素的距離(用「零」數表示,我的意思是假設如果我們看到上面的結構,我們在sym =「e」處有left = right =「0」將是「00」,因爲它是遠離最右邊元素的3個元素)。

所以輸出必須是這樣的:

e= 00 
d= 000 
c= 0000 
b= 00000 
a= 000000 

我對實現它是如下(不工作)代碼:

i=dataSize-1; //you can see the output below to know it's value, which is exactly 
//corresponding to the element matrix i have taken above at starting. 
    printf("before i:%d\n"); 
    do{ 
     char temp[30]; 
     strcpy(temp, var); 
     strcat(temp, "0"); 
     printf("\ntemp: %s ", temp); 
     printf("sym :%c \n", data[i].sym); 
     printf("Valuse of i:%d\n",i); 
     i=i-1; 

    } while(data[i].left==0 && data[i].right==0); 

輸出與之相對應的是(這預計不會):

[a 0 0 0] [b 1 0 0] [z 1 b a] [c 2 0 0] [d 3 0 0] [z 3 c z] [e 4 0 0] [z 6 z d] [z 10 z e] 

data size 9 
before i:2 
temp: 0 
sym :z //and it prints the last element whereas it's 
left and right child are not zero 
Valuse of i:8 

請問任何人請解釋我應該如何改變我的代碼以獲得願望輸出? (我是初學者程序員)

+1

首先,你應該擺脫'break'語句,因爲它可以防止你的'do while'循環被執行多次! – Toby

+0

@Toby \t 我刪除了中斷,輸出仍然是相同的,但爲什麼它進入第一個元素,即使我們沒有left = right = 0。我們可以看到,對於第一個索引,我們有[z 10 z e]而不是[z 10 0 0] – user3206225

+0

請說明你的代碼應該輸出什麼。我不明白你應該得到每個符號背後的邏輯。 –

回答

0

取出break !!!!!!!!!!!!!!!!!!!

+0

我刪除了中斷和輸出仍然是相同的,但爲什麼它進入第一個元素,即使我們沒有left = right = 0 there.we可以看到,對於第一個索引我們有[z 10 ze]而不是[z 10 0 0]。 – user3206225

0

嗯,我只能猜測你想要做什麼(很抱歉,但我有一個很難理解你的問題):

我假設你只想打印已在田野left價值0元素和right。 什麼re actually doing is, that you重新檢查您的while環回這種情況,這將導致它在第一次迭代後中斷。 這是因爲在你的第一次迭代開始與指數i=9 - 然後你打印出來的數據i(如果不管它是你想要的數據或沒有)。然後,你檢查的數據(leftright)在while -loop的條件tomatch 0。由於data[i] = data[9]它會看到left!=0right!=0,這將導致您的循環中斷。

,你所要做的就是:讓循環遍歷從陣列中的所有元素,並檢查循環爲您的數據裏面。

這裏是一些代碼來解釋:

i = dataSize-1; // Initialize your index 
do 
{ 
    if((data[i].left==0) && (data[i].right==0)) // Check for your data in left and right 
    { 
     // Print your data or do whatever you want to do 
    } 
    i--; // i = i-1; 
} while(i>=0) // Do this for every index of your array 

這樣,你確保你檢查你的元素的每一個。此外,我會使用for環回,而不是do-while,但這是一個品味問題。

我希望這可以幫助你,否則試圖闡述你的問題多一點!

+0

我只是試圖做你要求我做的事情:i = dataSize-1; printf(「之前我:%d \ n」,i); (數據[i] .left =='0'&& data [i] .right =='0') { { strcpy(temp,var); strcat(temp,「0」); 012fprintf(「\ ntemp:%s」,temp); printf(「sym:%c \ n」,data [i] .sym); \t printf(「我的錯誤:%d \ n」,i); i = i-1; \t} \t // break; } while(i> = 0); – user3206225

+0

但輸出卡住了(它讓我覺得有任何無限的狀況正在進行):從文件讀取的數據如下: [a 0 0 0] [b 1 0 0] [c 2 0 0] [d 3 0 0] [e 4 0 0] 它是在一種方式:符號頻率左兒子右兒子 數據大小5 [a 0 0 0] [b 1 0 0] [z 1 ba] [c 2 0 0] [d 3 0 0] [z 3 cz] [e 4 0 0] [z 6 zd] [z 10 ze] 數據大小9 在我之前:8不在之後停頓 – user3206225