设为首页 加入收藏

TOP

数据结构C语言实现系列:队列
2014-11-11 11:00:06 来源: 作者: 【 】 浏览:40
Tags:数据结构 语言 实现 系列 队列

  #include


  #include


  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");


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如果上帝是程序员的C++分析 下一篇数据结构C语言实现系列:线性表

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: