【数据结构】队列queue、普通链表list
来源:互联网 发布:预算员找工作知乎 编辑:程序博客网 时间:2024/05/26 09:53
【队列】
队列也可以用来存放数字,这些数字之间也有顺序
"先进入的数字在前,后进入的数字在后"
每次从队列里获得数字的时候永远的到的是最先放进去的数字
这个规则叫"先进先出"
队列实现里也需要包含一个用来向队列里放数字的函数,这个函数也叫"push"
队列实现里也需要包含一个用来从队列里获得数字的函数,这个函数也叫"pop"
<队列的实例演示,代码可做框架>
【链表】
"链表"也是一种数据结构,它提供了对线性链式物理结构的管理功能
链表可以把"使用数据的代码"和"管理线性链式物理结构的代码"分隔开(写的工程师也不一样,因为要求不一样)
链表的功能主要包括"插入","删除","查找","遍历"
<链表的实例演示,代码可做框架>
队列也可以用来存放数字,这些数字之间也有顺序
"先进入的数字在前,后进入的数字在后"
每次从队列里获得数字的时候永远的到的是最先放进去的数字
这个规则叫"先进先出"
队列实现里也需要包含一个用来向队列里放数字的函数,这个函数也叫"push"
队列实现里也需要包含一个用来从队列里获得数字的函数,这个函数也叫"pop"
<队列的实例演示,代码可做框架>
/*代码*/ .c源文件/*顺序结构编写:队列*/#include "01queue.h"void queue_init(Queue *p_queue) { //队列初始化 p_queue->head = 0; p_queue->tail = 0;}void queue_deinit(Queue *p_queue) { //队列清理 p_queue->head = 0; p_queue->tail = 0;}int queue_empty(const Queue *p_queue) { //判断队列是否为空 return p_queue->head == p_queue->tail;}int queue_full(const Queue *p_queue) { //判断队列是否是满 return p_queue->tail >= SIZE;}int queue_size(const Queue *p_queue) { //统计有效数字个数 return p_queue->tail - p_queue->head;}//向队列里放数字的函数,num代表新的数void queue_push(Queue *p_queue, int num) { p_queue->buf[p_queue->tail] = num; p_queue->tail++;}//从队列里获得数字的函数,会把数字从队列里删除int queue_pop(Queue *p_queue) { int ret = p_queue->buf[p_queue->head]; p_queue->head++; return ret;}//也可以从队列里获得数字,不会把数字从队列里删除int queue_front(const Queue *p_queue) { return p_queue->buf[p_queue->head];}/*代码*/ .h头文件#ifndef __01QUEUE_H__#define __01QUEUE_H__typedef struct { int buf[SIZE]; int head, tail; } Queue;/*head表示第1个数字所在存储区下标,tail表示最后1个数字所在存储区的后一个>存储区的下标。如果队列里没有数字的时候head和tail相等*/void queue_init(Queue *);//初始化void queue_deinit(Queue *);//清理int queue_empty(const Queue *);//判断空int queue_full(const Queue *);//判断满int queue_size(const Queue *); //统计数字个数void queue_push(Queue *, int);//放数字int queue_pop(Queue *);//拿数字,并删除int queue_front(const Queue *);//拿数字,不删除#endif //__01QUEUE_H__/*代码*/ .c主函数#include <stdio.h>#include "01queue.h"int main() { Queue que = {0}; queue_init(&que); printf("判断空的结果是%d\n", queue_empty(&que));//1 printf("判断满的结果是%d\n", queue_full(&que));//0 printf("有效数字个数是%d\n", queue_size(&que));//0 queue_push(&que, 1); queue_push(&que, 3); queue_push(&que, 5); printf("判断空的结果是%d\n", queue_empty(&que));//0 printf("判断满的结果是%d\n", queue_full(&que));//0 printf("有效数字个数是%d\n", queue_size(&que));//3 printf("%d ", queue_pop(&que)); printf("%d ", queue_pop(&que)); printf("%d\n", queue_pop(&que)); printf("判断空的结果是%d\n", queue_empty(&que));//1 printf("判断满的结果是%d\n", queue_full(&que));//0 printf("有效数字个数是%d\n", queue_size(&que));//0 queue_push(&que, 7); queue_push(&que, 9); printf("判断满的结果是%d\n", queue_full(&que));//0 printf("最前面的数字是%d\n", queue_front(&que));//7 printf("%d ", queue_pop(&que)); printf("%d\n", queue_pop(&que)); queue_deinit(&que); return 0;}
【链表】
"链表"也是一种数据结构,它提供了对线性链式物理结构的管理功能
链表可以把"使用数据的代码"和"管理线性链式物理结构的代码"分隔开(写的工程师也不一样,因为要求不一样)
链表的功能主要包括"插入","删除","查找","遍历"
<链表的实例演示,代码可做框架>
/*代码*/ 02list.h头文件#ifndef __02LIST_H__#define __02LIST_H__#include <stdlib.h>typedef struct Node{ int num; struct Node *p_next; struct Node *p_prev; //prev:上一个} Node;typedef struct { Node head, tail;} Link;void link_init(Link *); //链表初始化void link_deinit(Link *); //链表清理int link_size(const Link *); //统计有效节点数据个数//把新数字加入到最前面,num代表要加入的数字void link_add_head(Link *, int);//把新数字加入到最后面(追加),num代表要加入的数字void link_append(Link *, int);//按顺序加入新数字void link_insert_in_order(Link *, int);//删除最前面数字的函数void link_remove_head(Link *);//删除最后一个数字的函数void link_remove_tail(Link *);//删除某个数字的函数void link_remove(Link *, int);//获得第一个数字的函数int link_get_head(const Link *, int *);//获得最后一个数字的函数int link_get_tail(const Link *, int *);//获得某个编号的数字的函数,num表示编号,*p_num获得的数字int link_get(const Link *, int, int *);#endif //__02LIST_H__/*代码*/ 02list.c源文件#include <stdlib.h>#include "02list.h"//链表的初始化函数void link_init(link *p_link) { p_link->head.p_next = &(p_link->tail); p_link->tail.p_prev = &(p_link->head); p_link->tail.p_next = NULL; p_link->head.p_prev = NULL;}//链表的清理函数void link_deinit(link *p_link) { while (p_link->head.p_next != &(p_link->tail)) { node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; p_first->p_next = p_last; p_last->p_prev = p_first; free(p_mid); p_mid = NULL; }}//计算有效节点个数的函数int link_size(const link *p_link) { int cnt = 0; const node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { const node *p_first = p_node; const node *p_mid = p_first->p_next; const node *p_last = p_mid->p_next; cnt++; } return cnt - 1;}//把新数字加入到最前面void link_add_head(link *p_link, int num) { node *p_first = NULL, *p_mid = NULL, *p_last = NULL; node *p_node = (node *)malloc(sizeof(node)); if (!p_node) { return ; } p_node->num = num; p_node->p_next = NULL; p_node->p_prev = NULL; p_first = &(p_link->head); p_mid = p_first->p_next; p_last = p_mid->p_next; p_first->p_next = p_node; p_node->p_prev = p_first; p_node->p_next = p_mid; p_mid->p_prev = p_node;}//把新数字加入到末尾void link_append(link *p_link, int num) { node *p_node = NULL, *p_tmp = NULL; p_node = (node *)malloc(sizeof(node)); if (!p_node) { return ; } p_node->num = num; p_node->p_next = NULL; p_node->p_prev = NULL; for (p_tmp = &(p_link->head);p_tmp != &(p_link->tail);p_tmp = p_tmp->p_next) { node *p_first = p_tmp; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail)) { p_first->p_next = p_node; p_node->p_prev = p_first; p_node->p_next = p_mid; p_mid->p_prev = p_node; break; } }}//按顺序加入新数字void link_insert_in_order(link *p_link, int num) { node *p_tmp = NULL; node *p_node = (node *)malloc(sizeof(node)); if (!p_node) { return ; } p_node->num = num; p_node->p_next = NULL; p_node->p_prev = NULL; for (p_tmp = &(p_link->head);p_tmp != &(p_link->tail);p_tmp = p_tmp->p_next) { node *p_first = p_tmp; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail) || p_mid->num > num) { p_first->p_next = p_node; p_node->p_prev = p_first; p_node->p_next = p_mid; p_mid->p_prev = p_node; break; } }}//删除最前边数字的函数void link_remove_head(link *p_link) { node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail)) { return ; } p_first->p_next = p_last; p_last->p_prev = p_first; free(p_mid); p_mid = NULL;}//删除最后一个数字的函数void link_remove_tail(link *p_link) { node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_last == &(p_link->tail)) { p_first->p_next = p_last; p_last->p_prev = p_first; free(p_mid); p_mid = NULL; break; } }}//删除某个数字的函数void link_remove(link *p_link, int num) { node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail) && p_mid->num == num) { p_first->p_next = p_last; p_last->p_prev = p_first; free(p_mid); p_mid = NULL; break; } }}//获得第一个数字的函数int link_get_head(const link *p_link, int *p_num) { if (p_link->head.p_next == &(p_link->tail)) { return 0; } else { *p_num = p_link->head.p_next->num; return 1; }}//获得最后一个数字的函数int link_get_tail(const link *p_link, int *p_num) { const node *p_node = NULL; if (p_link->head.p_next == &(p_link->tail)) { return 0; } for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { const node *p_first = p_node; const node *p_mid = p_first->p_next; const node *p_last = p_mid->p_next; if (p_last == &(p_link->tail)) { *p_num = p_mid->num; return 1; } }}//获得某个编号的数字int link_get(const link *p_link, int num, int *p_num) { int cnt = 0; const node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { const node *p_first = p_node; const node *p_mid = p_first->p_next; const node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail) && cnt == num) { *p_num = p_mid->num; return 1; } cnt++; } return 0;}
/*代码*/ 02main.c主函数(测试)#include <stdio.h>#include "02list.h"int main() { int num = 0, size = 0, num1 = 0; Link lnk = {0}; link_init(&lnk); link_add_head(&lnk, 4); link_add_head(&lnk, 2); link_append(&lnk, 13); link_insert_in_order(&lnk, 8); link_append(&lnk, 21); link_append(&lnk, 33); link_append(&lnk, 37); link_append(&lnk, 42); link_append(&lnk, 45); link_remove_head(&lnk); link_remove_tail(&lnk); link_remove(&lnk, 33); link_get_head(&lnk, &num); printf("最前面的数字是%d\n", num); //4 link_get_tail(&lnk, &num); printf("最后面的数字是%d\n", num); //42 size = link_size(&lnk); for(num = 0; num < size; num++) { link_get(&lnk, num, &num1); printf("%d ", num1); //4 8 13 21 37 42 } printf("\n"); link_deinit(&lnk); return 0;}
1 0
- 【数据结构】队列queue、普通链表list
- 数据结构 二:表(list)、栈(stack)、队列(Queue)
- [Java数据结构]线性表之队列Queue
- 队列数据结构 Queue.h
- 【数据结构】顺序队列 Queue
- 数据结构-队列(queue)
- 数据结构_队列(queue)
- 数据结构-队列(queue)
- 数据结构复习 - 队列Queue
- 队列(queue)数据结构
- 数据结构-队列(Queue)
- [C++数据结构]队列Queue
- C#数据结构--队列Queue
- 数据结构之队列queue
- Java 数据结构----Java队列Queue
- Java 数据结构之 Queue(队列)
- 基本数据结构:队列(queue)
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 集合框架_模拟斗地主洗牌和发牌
- js学习笔记:引用类型——RegExp
- Go-List(Cont)
- 第1章开始程序-你的第一行Android代码
- office2010粘贴无法使用
- 【数据结构】队列queue、普通链表list
- Docker镜像仓库服务registry.Service
- 小博老师解析Java核心技术 ——JDBC普通增删改操作
- hdu 5183 hash
- 三国佚事——巴蜀之危
- python实现对HDFS的文件操作
- MapReduce的初步学习过程与基本示例
- ARM架构下安装tensorflow与opencv3.2DNN模块
- android在grid组件中加入添加删除图片按钮