【数据结构】队列queue、普通链表list

来源:互联网 发布:预算员找工作知乎 编辑:程序博客网 时间:2024/05/26 09:53
【队列】
队列也可以用来存放数字,这些数字之间也有顺序
"先进入的数字在前,后进入的数字在后"
每次从队列里获得数字的时候永远的到的是最先放进去的数字
这个规则叫"先进先出"
队列实现里也需要包含一个用来向队列里放数字的函数,这个函数也叫"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
原创粉丝点击