資料結構,資料結構與演算法
隊列的鏈式實現
1 隊列的鏈式儲存表示
隊列的鏈式儲存結構簡稱為鏈隊列,它是限制在表頭進行刪除操作和表尾進行插入操作的單鏈表。
需要兩類不同的結點:資料元素結點,隊列的隊首指標和隊尾指標的結點
指標結點類型定義:
typedef struct link_queue{ QNode *front , *rear ;}LinkQueue ;
2 鏈隊運算及指標變化
鏈隊的操作實際上是單鏈表的操作,只不過是刪除在表頭進行,插入在表尾進行。插入、刪除時分別修改不同的指標
3 鏈隊列的基本操作⑴ 鏈隊列的初始化Status Init_LinkQueue(LinkQueue *Q ){ /*成功返回OK,否則返回ERROR*/ QNode *p ;p=(QNode *)malloc(sizeof(QNode)) ; /* 開闢頭結點 */if(p==NULL) return ERROR;p->next=NULL ;Q->front=Q->rear=p ; return OK;}
⑵ 鏈隊列的入隊操作 在已知隊列的隊尾插入一個元素e ,即修改隊尾指標(Q.rear)。Status Insert_LinkQueue(LinkQueue *Q , ElemType e) /* 將資料元素e插入到鏈隊列Q的隊尾 */{ QNode *p ; p=(QNode *)malloc(sizeof(QNode)) ;if (!p) return ERROR;/* 申請新結點失敗,返回錯誤標誌 */p->data=e ; p->next=NULL ; /* 形成新結點 */Q->rear->next=p ; Q->rear=p ; /* 新結點插入到隊尾 */return OK;}
鏈隊列的出隊操作Status Delete_LinkQueue(LinkQueue *Q, ElemType *x) { QNode *p ;if (Q->front==Q->rear) return ERROR ; /* 隊空 */p=Q->front->next ; /* 取隊首結點 */*x=p->data ; Q->front->next=p->next ; /* 修改隊首指標 */if (p==Q->rear) Q->rear=Q->front ; /* 當隊列只有一個結點時應防止丟失隊尾指標 */ free(p) ; return OK ; }
⑷ 鏈隊列的撤消void Destroy_LinkQueue(LinkQueue *Q ) /* 將鏈隊列Q的隊首元素出隊 */{ while (Q->front!=NULL){Q-> rear= Q-> front->next; /* 令尾指標指向隊列的第一個結點 */free(Q-> front); /* 每次釋放一個結點 */ /* 第一次是頭結點,以後是元素結點 */Q-> front= Q-> rear;}}