2013-02-03 43 views
0

我對c和指針非常陌生。每次我瘦K I明白了,總會有,我真的不明白(我花了一些時間閱讀ç文檔,但指針仍然不清楚我)一個問題:使用隊列類型指針

typedef struct { 
     int q[QUEUESIZE+1]; 
     int first; 
     int last; 
     int count; 
} queue; 

enqueue(queue *q, int x) 
{ 
    if (q->count >= QUEUESIZE) 
     printf("Warning: queue overflow enqueue x=%d\n",x); 

    else { 
    q->last = (q->last+1) % QUEUESIZE; 
    q->q[ q->last ] = x; 
    q->count = q->count + 1; 
    } 
} 

我希望我的問題會不是太不透明,但可以解釋在排隊函數中使用指針嗎?我認爲排隊原則是分配一些精確連續的存儲器地址,但它不是肯定....

+2

什麼問題?你有錯誤嗎?什麼不工作?請準確,所以你節省我們的時間猜測:) – m0skit0

+3

@ m0skit0:讓我爲你突出顯示它:***有人可以解釋指針在'enqueue'函數中的使用嗎?*** –

+0

@AlokSave解釋什麼?指針如何工作?我不明白他到底想知道什麼...... – m0skit0

回答

3

enqueue需要隊列隊列(類型隊列的隊列),並在添加元素它(這是由一個整數。

queue *q是一個指針,因爲可能

  • 可能有不止一個隊列,參數告訴什麼排隊,我們正在談論
  • 爲了避免一個全局變量,隊列給定的參數 - 我們希望在隊列的引用,以便它可以被修改,甚至退出enqueue

傳遞一個隊列後的修改將保持活由值,如

enqueue(queue q, int x) { ... 

將意味着

  • 很多
  • 01給定的參數(隊列myQueue中的拷貝到 q參數)的數據的
  • q被修改時,在enqueue函數內對q進行修改。 初始提供的隊列(myQueue中)作爲參數不會被修改

例如

enqueue(queue q, int x) { 
    q.count++; // only the local q.count is changed, not myqueue.count 
    // ... 
} 

// ... 

queue myqueue; 
// ... 
enqueue (myqueue, 3); // enqueue changes its local parameter, myqueue is not affected 

此外,enqueue功能的實現可以優化......(見下文誰提出wildplasser答案一個更好的隊列實現)

+0

好了,現在很清楚! – user1611830

1
struct queue { 
     unsigned first; 
     unsigned count; 
     int q[QUEUESIZE]; 
     }; 

int enqueue(struct queue *q, int x) 
{ 
    if (q->count >= QUEUESIZE) { 
     fprintf(stderr, "Warning: queue overflow enqueue x=%d\n", x); 
     return -1; 
     } 

    q->q[ (q->first+q->count++) % QUEUESIZE ] = x; 
    return 0; /* success */ 
} 

的幾點:

  • 診斷輸出應該去到stderr
  • 使用無符號類型的計數和偏移量將(在大多數情況下),避免數值下溢(或將其轉換成溢流,這將失敗更快;-)
  • 你不需要三個元素{head,tail,count},只有兩個{head,count}就足夠了
  • 更少的變量:=更少的分配:=更少的行數=更少的出錯機會。
  • 範圍檢查和模塊劃分中的QUEUESIZE可能應該替換爲sizeof q->q/sizeof q->q[0],它更加健壯。