zoukankan      html  css  js  c++  java
  • 队列的链式表示

          队列是和栈相反的一中线性结构,栈的后进先出LIFO结构,而队列是先进先出FIFO结构。它只允许在表的一端进行插入,而在另一端进行删除。

      1 /**
      2 和栈相反,队列是一种先进先出FIFO的结构,包括队头front,队尾rear
      3 使用链式结构表示队列时,分别一个头指针和尾指针。为操作方便,链队列也有一个头结点,则空的队列的判断条件就是
      4 头指针和尾指针都指向头结点
      5 */
      6 #include <stdio.h>
      7 #include <stdlib.h>
      8 
      9 //*************************单链队列的存储结构**********************************
     10 typedef struct QNode
     11 {
     12     int data;
     13     QNode *next;
     14 }QNode,*QuenePtr;
     15 typedef struct
     16 {
     17     QuenePtr front;  //队头指针
     18     QuenePtr rear;   //队尾指针
     19 }LinkQuene;
     20 
     21 //**************************基本操作算法说明************************************
     22 
     23 //***************************构造一个空队列*************************************
     24 void InitQuene(LinkQuene &Q)
     25 {
     26     //构造一个空队列Q
     27     Q.front = (QuenePtr)malloc(sizeof(QNode));
     28     if (!Q.front)
     29     {
     30         printf("存储分配失败,任意键退出!
    ");
     31         getchar();
     32         exit(1);
     33     }
     34     Q.rear = Q.front;
     35     Q.front ->next = NULL;
     36 }
     37 //*****************************输出队列元素*************************************
     38 void PrintQuene(LinkQuene Q)
     39 {
     40     if (Q.front == Q.rear)
     41     {
     42         printf("该队列为空,无法输出!任意键退出!
    ");
     43         getchar();
     44         exit(1);
     45     }
     46     QNode *p = Q.front->next;//另p指向第一个数据元素
     47     while(p->next)
     48     {
     49         printf("%d ", p->data);
     50         p = p -> next;
     51     }
     52     //输出队尾数据
     53     printf("%d
    ",Q.rear->data);
     54 }
     55 
     56 
     57 //*******************************销毁队列**************************************
     58 void DestroyQuene(LinkQuene &Q)
     59 {
     60     //销毁队列,不是置空,从前向后一个一个删除
     61     while(Q.front)
     62     {
     63         Q.rear = Q.front;
     64         free(Q.front);
     65         Q.front = Q.rear;
     66     }
     67 }
     68 
     69 //********************************队列的数据元素插入*****************************
     70 void EnQuene(LinkQuene &Q,int e)
     71 {
     72     //插入元素e作为队列新的队尾元素
     73     QuenePtr p = (QuenePtr)malloc(sizeof(QNode));
     74     if (!p)
     75     {
     76         printf("存储分配失败,任意键退出!
    ");
     77         getchar();
     78         exit(1);
     79     }
     80     p -> data = e;
     81     p -> next = NULL;
     82     //插入p结点
     83     Q.rear ->next = p;
     84     Q.rear = p;
     85 }
     86 
     87 //*******************************队列数据元素的删除********************************
     88 void DeQuene(LinkQuene &Q)
     89 {
     90     //若队列不空,则删除Q的队头元素,否则,报错
     91     if (Q.front == Q.rear)
     92     {
     93         printf("队列Q为空,无法删除!任意键退出
    ");
     94         getchar();
     95         exit(1);
     96     }
     97 
     98     QuenePtr p = Q.front -> next;
     99     Q.front -> next = p -> next;
    100     if (Q.rear == p)
    101     {
    102         //只有一个结点元素的情况
    103         Q.rear = Q.front;
    104     }
    105     free(p);
    106 }
    107 
    108 
    109 int main()
    110 {
    111     LinkQuene Q;
    112     //初始化队列Q
    113     InitQuene(Q);
    114 
    115     //构造队列
    116     int count;//初始队列元素个数
    117     int value;//初始队列元素值
    118     printf("请输入初始队列的元素个数:");
    119     scanf("%d",&count);
    120     printf("请依次输入这些数据元素:");
    121     for (int i = 0; i < count; ++i)
    122     {
    123         scanf("%d",&value);
    124         EnQuene(Q,value);
    125     }
    126     printf("当前队列的元素为:");
    127     PrintQuene(Q);
    128 
    129     //插入队列尾元素
    130     printf("请输入插入值:");
    131     scanf("%d",&value);
    132     EnQuene(Q,value);
    133     printf("插入后队列的元素为:");
    134     PrintQuene(Q);
    135 
    136     //删除队列头元素
    137     DeQuene(Q);
    138     printf("删除后队列的元素为:");
    139     PrintQuene(Q);
    140     return 0;
    141 }
  • 相关阅读:
    git push出现unpack failed: error Missing tree错误的解决方法
    Android N 分屏
    adb 查看最上层activity名字
    Ubuntu 切换JDK 版本
    Android的开机流程
    HTTP 协议中GET和POST到底有哪些区别(转)
    github爬虫100项目
    web攻击之xss(一)
    Kali-Dos洪水攻击之Hping3
    zipCrack-v1.1 工具介绍
  • 原文地址:https://www.cnblogs.com/wujiyang/p/4348503.html
Copyright © 2011-2022 走看看