簡體   English   中英

對隊列類型使用指針

[英]Using pointers for queue type

我對c和指針很陌生。 每次我了解了k時,都會遇到一個我並不真正理解的問題(我花了一些時間閱讀c docs,但仍然對我不清楚指針):

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;
  } 
}

我希望我的問題不會太模糊,但是有人可以解釋在入隊函數中使用指針嗎? 我以為排隊的原則是分配一些精確的連續內存地址,但不是肯定的。

enqueue接受一個隊列隊列(類型為queue的隊列 ),並在其中添加一個元素(由整數組成)。

queue *q是一個指針,因為

  • 可能有多個隊列,並且該參數告訴我們正在談論的隊列
  • 為了避免全局變量,將隊列作為參數給出-我們需要對隊列的引用,以便可以對其進行修改,並且即使退出入enqueue后,修改也將保持有效

按值傳遞隊列,如

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

意味着

  • 作為參數給出了大量數據(隊列myqueue到q參數的副本)
  • q被修改時,修改在由q的內enqueue功能。 最初提供的隊列(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答案,誰建議使用更好的隊列實現)

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] ,它更可靠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM