c语言队列的实现

C语言实现队列在实际开发中经常会遇到,但是网上的写的都比较复杂,在这里写一个实现队列的方式,记录下来,以便自己日后查看,也为别人提供参考。

外国有一句话叫1张图抵得上10句话,我这里主要画图解释,通俗易懂,整个的实现逻辑是:

队列一定有头指针和尾指针,第一个节点时头指针和尾指针指向同一个节点

 

 

下一个数据到来后,rear->next指向新节点(连接起来),rear指向新节点(移动rear)

 

最终rear始终指向数据最后一个数据的地址(实时跟踪节点变化,像不像GPS,^_^)

 

下面贴上代码:

有几点需要说明,我在main函数了里初始化了头结点,也许是链表的习惯。

这里面使用了2级指针,因为一级指针定以后不初始化,指向的是内存的一个未知区域,而2级指针方便指针赋值操作,减少bug的产生

 

 

 

 

 

 

  1 typedef char* QElemType;
  2 
  3 typedef struct QNode //节点结构
  4 {
  5 QElemType data;
  6 struct QNode *next;
  7 }QNode,*QueuePtr;
  8 
  9 typedef struct Link_queue//队列的链表结构
 10 {
 11 QueuePtr front,rear; //队列的头、尾指针
 12 }LinkQueue;
 13 
 14 
 15 typedef int Status;
 16 
 17 #define ERR_OK 0
 18 #define ERR_NO 1
 19 
 20 //入队操作
 21 Status Enqueue(LinkQueue* Q,QElemType e)
 22 {
 23 QueuePtr newNode = (QueuePtr)malloc(sizeof(QNode)); //新建队列节点
 24 
 25 size_t len = strlen(e);
 26 
 27 newNode->data = (QElemType)malloc(len+2*sizeof(char));    //为节点数据域分配内存
 28 
 29 //数据域循环赋值
 30 int i=0;
 31 for(i=0;i<len;i++)
 32 {
 33 newNode->data[i] = e[i];
 34 }
 35 newNode->data[len] = '\0';
 36 
 37 
 38 newNode->next = NULL;
 39 
 40 Q->rear->next = newNode; //队列的尾指针指向的当前节点的下一个位置,指向s
 41 Q->rear = newNode;    //队列的尾指针向后移动至新节点
 42 return ERR_OK;
 43 
 44 }
 45 
 46 //出队操作,使用后需要释放e的内存
 47 Status DeQueue(LinkQueue* Q,QElemType* e)
 48 {
 49 QueuePtr p;
 50 
 51 p = Q->front->next; //要出队的是头结点的下一个节点
 52 //*e = p->data;    //将要出队的节点数据赋值给e
 53 size_t len = strlen(p->data);
 54 
 55 *e=(QElemType)malloc(len+2*sizeof(char));
 56 
 57 
 58 int i=0;
 59 for(i=0;i<len;i++)
 60 {
 61 (*e)[i] = p->data[i];
 62 }
 63 (*e)[len]='\0';
 64 
 65 Q->front->next = p->next;
 66 
 67 if(Q->rear == p) //尾指针指向p说明队列空了
 68 {
 69 Q->rear = Q->front;
 70 }
 71 
 72 free(p->data);
 73 free(p);
 74 return ERR_OK;
 75 }
 76 
 77 
 78 void main(void)
 79 {
 80 QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
 81 
 82 s->data = 0;
 83 s->next = NULL;
 84 
 85 LinkQueue linkqueue;
 86 
 87 linkqueue.front = s;
 88 linkqueue.rear = s;
 89 
 90 Enqueue(&linkqueue,"hello1");
 91 Enqueue(&linkqueue,"hello2");
 92 Enqueue(&linkqueue,"hello3");
 93 Enqueue(&linkqueue,"hello4");
 94 Enqueue(&linkqueue,"hello5");
 95 
 96 QElemType value;
 97 QElemType value1;
 98 QElemType value2;
 99 QElemType value3;
100 
101 DeQueue(&linkqueue,&value);
102 printf("value=%s",value);
103 //    
104 DeQueue(&linkqueue,&value1);
105 printf("value1=%s",value);
106 
107 DeQueue(&linkqueue,&value2);
108 printf("value2=%s",value);
109 
110 DeQueue(&linkqueue,&value3);
111 printf("value3=%s",value);
112 
113 
114 getchar();
115 
116 }

 

 

运行结果:

 

转载于:https://www.cnblogs.com/zhuzbyin/p/ghst_zby1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值