链表创建队列
来源:互联网 发布:excel重复数据合计 编辑:程序博客网 时间:2024/06/01 23:26
首先队列需要二个元素front和rear来表示现在所指向的节点,front指向的是 头结点,而头结点指向的是第一个有效元素,尾节点指向最后一个有效元素。
void initQueue(PQUEUE);
void push(PQUEUE,int);
void Front(PQUEUE,int *);
void travers_list(PQUEUE);
bool pop(PQUEUE,int * );
bool is_Empty(PQUEUE);
void Clear(PQUEUE s);
队列实现了以上几个操纵
1.创建队列
void initQueue(PQUEUE q){ q->pRear=(PNODE)malloc(sizeof(NODE)); if(q->pRear==NULL) { printf("分配内存失败\n"); exit(-1); } q->pFront=q->pRear; q->pFront->pNext=NULL;}在此创建头结点,将头结点和尾节点同时指向同一个地址
2.入队
void push(PQUEUE p,int val){ PNODE s=(PNODE)malloc(sizeof(NODE)); if(s==NULL) { printf("分配内存失败\n"); exit(-1); return ; } s->date=val; s->pNext=NULL; p->pRear->pNext=s; p->pRear=s;}把入队的值分配给新的节点,然后让尾节点的pNext指向此元素,最后尾节点指向此元素顺序不可交换,最后一个节点的pNext要为空,是判断队列为空的重要标志
3.数组的遍历
void travers_list(PQUEUE s){ if(is_Empty(s)) { printf("队列已经空了\n"); return ; } PNODE p=s->pFront->pNext; while(p!=NULL) { printf("%d ",p->date); p=p->pNext; } printf("\n"); return ;}先判断数组是否为空 如果是空则不用判断,用一个PNODE指针指向头结点的pNext即为第一个元素,当p为空时就是最后一个节点
4.出队
bool pop(PQUEUE s,int * val){ if(is_Empty(s)) { printf("栈已经空了\n"); return false; } PNODE p=s->pFront->pNext; *val=p->date; if(p==s->pRear) s->pRear=s->pFront; else s->pFront->pNext=p->pNext; free(p); p=NULL; return true;}数组为空返回,当判断到是最后一个元素时即p=s->pRear时需要把尾节点的值赋值成头指针
5.判断是否为空
bool is_Empty(PQUEUE s){ if(s->pFront==s->pRear) return true; else return false;}如果尾节点和头结点指向的地址相同则为空
6.清除所有元素
void Clear(PQUEUE s){ PNODE s1=s->pFront->pNext; PNODE s2; while(s1!=NULL) { s2=s1; s1=s1->pNext; free(s2); s2=NULL; } s->pRear=s->pFront;最后要让尾节点和头结点指向的一样
完整代码:
#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>typedef struct Node{ int date; Node * pNext;}NODE,*PNODE;typedef struct Queue{ PNODE pFront; PNODE pRear;}QUEUE,*PQUEUE;void initQueue(PQUEUE);void push(PQUEUE,int);void Front(PQUEUE,int *);void travers_list(PQUEUE);bool pop(PQUEUE,int * );bool is_Empty(PQUEUE);void Clear(PQUEUE s);int main(){ Queue s; int val; initQueue(&s); push(&s,1); push(&s,2); push(&s,3); push(&s,4); push(&s,5); push(&s,6); travers_list(&s); //printf("%d\n",val); pop(&s,&val);pop(&s,&val);pop(&s,&val);pop(&s,&val);pop(&s,&val);pop(&s,&val); travers_list(&s); push(&s,6); travers_list(&s); Clear(&s); travers_list(&s);}void initQueue(PQUEUE q){ q->pRear=(PNODE)malloc(sizeof(NODE)); if(q->pRear==NULL) { printf("分配内存失败\n"); exit(-1); } q->pFront=q->pRear; q->pFront->pNext=NULL;}void push(PQUEUE p,int val){ PNODE s=(PNODE)malloc(sizeof(NODE)); if(s==NULL) { printf("分配内存失败\n"); exit(-1); return ; } s->date=val; s->pNext=NULL; p->pRear->pNext=s; p->pRear=s;}void travers_list(PQUEUE s){ if(is_Empty(s)) { printf("队列已经空了\n"); return ; } PNODE p=s->pFront->pNext; while(p!=NULL) { printf("%d ",p->date); p=p->pNext; } printf("\n"); return ;}bool pop(PQUEUE s,int * val){ if(is_Empty(s)) { printf("栈已经空了\n"); return false; } PNODE p=s->pFront->pNext; *val=p->date; if(p==s->pRear) s->pRear=s->pFront; else s->pFront->pNext=p->pNext; free(p); p=NULL; return true;}bool is_Empty(PQUEUE s){ if(s->pFront==s->pRear) return true; else return false;}void Clear(PQUEUE s){ PNODE s1=s->pFront->pNext; PNODE s2; while(s1!=NULL) { s2=s1; s1=s1->pNext; free(s2); s2=NULL; } s->pRear=s->pFront;}
阅读全文
0 0
- 链表创建队列
- Java 基于链表的队列创建
- 用类创建链队列
- 队列--链表队列
- 关于队列(数组队列,链表队列,循环队列)
- 压链栈与进链队列和创建线性表的关系
- 队列和栈的应用、单链表的创建、模拟链表
- 创建.net优先队列
- 创建 I/O 队列
- 使用数组创建队列
- GCD:创建并发队列
- dispatch_queue_create---创建队列
- 循环队列的创建
- 创建消息队列
- 创建循环队列
- 链式队列的创建
- 链式队列创建
- 批量创建消息队列
- SSM(spring +springmvc +mybatis)框架搭建
- day21桶排序一个无序数组+求一个无序数组中的中位数
- HDU 4912 LCA+策略
- Java中Synchronized的用法
- 浅谈最短路中的Dijskra算法
- 链表创建队列
- openSession和getCurrentSession区别
- KMP 算法(1):如何理解 KMP
- Spark RDD API
- 批量提取一个文件夹中的文件名
- BZOJ 4806 炮(DP)
- cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'. 错误
- Excel在统计分析中的应用—第三章—数据库统计函数与数据透视表-Part1-(数据查询与筛选、分类汇总)
- 欢迎使用CSDN-markdown编辑器