程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 數據結構C語言實現之隊列

數據結構C語言實現之隊列

編輯:C語言基礎知識
#include <stdio.h>
#include <stdlib.h>

typedef int elemType;
/************************************************************************/
/* 以下是關於隊列鏈接存儲操作的6種算法 */
/************************************************************************/
struct sNode{
elemType data; /* 值域 */
struct sNode *next; /* 鏈接指針 */
};
struct queueLK{
struct sNode *front; /* 隊首指針 */
struct sNode *rear; /* 隊尾指針 */
};

/* 1.初始化鏈隊 */
void initQueue(struct queueLK *hq)
{
hq->front = hq->rear = NULL; /* 把隊首和隊尾指針置空 */
return;
}

/* 2.向鏈隊中插入一個元素x */
void enQueue(struct queueLK *hq, elemType x)
{
/* 得到一個由newP指針所指向的新結點 */
struct sNode *newP;
newP = malloc(sizeof(struct sNode));
if(newP == NULL){
printf("內存空間分配失敗! ");
exit(1);
}
/* 把x的值賦給新結點的值域,把新結點的指針域置空 */
newP->data = x;
newP->next = NULL;
/* 若鏈隊為空,則新結點即是隊首結點又是隊尾結點 */
if(hq->rear == NULL){
hq->front = hq->rear = newP;
}else{ /* 若鏈隊非空,則依次修改隊尾結點的指針域和隊尾指針,使之指向新的隊尾結點 */
hq->rear = hq->rear->next = newP; /* 注意賦值順序哦 */
}
return;
}

/* 3.從隊列中刪除一個元素 */
elemType outQueue(struct queueLK *hq)
{
struct sNode *p;
elemType temp;
/* 若鏈隊為空則停止運行 */
if(hq->front == NULL){
printf("隊列為空,無法刪除! ");
exit(1);
}
temp = hq->front->data; /* 暫存隊尾元素以便返回 */
p = hq->front; /* 暫存隊尾指針以便回收隊尾結點 */
hq->front = p->next; /* 使隊首指針指向下一個結點 */
/* 若刪除後鏈隊為空,則需同時使隊尾指針為空 */
if(hq->front == NULL){
hq->rear = NULL;
}
free(p); /* 回收原隊首結點 */
return temp; /* 返回被刪除的隊首元素值 */
}

/* 4.讀取隊首元素 */
elemType peekQueue(struct queueLK *hq)
{
/* 若鏈隊為空則停止運行 */
if(hq->front == NULL){
printf("隊列為空,無法刪除! ");
exit(1);
}
return hq->front->data; /* 返回隊首元素 */
}

/* 5.檢查鏈隊是否為空,若為空則返回1, 否則返回0 */
int emptyQueue(struct queueLK *hq)
{
/* 判斷隊首或隊尾任一個指針是否為空即可 */
if(hq->front == NULL){
return 1;
}else{
return 0;
}
}

/* 6.清除鏈隊中的所有元素 */
void clearQueue(struct queueLK *hq)
{
struct sNode *p = hq->front; /* 隊首指針賦給p */
/* 依次刪除隊列中的每一個結點,最後使隊首指針為空 */
while(p != NULL){
hq->front = hq->front->next;
free(p);
p = hq->front;
} /* 循環結束後隊首指針已經為空 */
hq->rear = NULL; /* 置隊尾指針為空 */
return;
}

/************************************************************************/
int main(int argc, char* argv[])
{
struct queueLK q;
int a[8] = {3, 8, 5, 17, 9, 30, 15, 22};
int i;
initQueue(&q);
for(i = 0; i < 8; i++){
enQueue(&q, a[i]);
}
printf("%d ", outQueue(&q)); printf("%d ", outQueue(&q));
enQueue(&q, 68);
printf("%d ", peekQueue(&q)); printf("%d ", outQueue(&q));
while(!emptyQueue(&q)){
printf("%d ", outQueue(&q));
}
printf(" ");
clearQueue(&q);
system("pause");
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved