C和指针 第十七章 经典数据类型

堆栈:

//
// Created by mao on 16-9-16.
//

#ifndef UNTITLED_STACK_H
#define UNTITLED_STACK_H
#define TRUE 1
#define FALSE 0

typedef int STACK_TYPE;
typedef struct stack{
    STACK_TYPE value;
    struct stack *next;
} STACK;

void create_stack();
void destory_stack();
void push(STACK_TYPE value);
STACK_TYPE pop();
int isEmpty();
#endif //UNTITLED_STACK_H

stack.h

//
// Created by mao on 16-9-16.
//
#include <stdlib.h>
#include "stack.h"

static STACK *stack;

void create_stack()
{
    stack = (STACK *)malloc(sizeof(STACK));
    stack -> next = NULL;
}

void destory_stack()
{
    STACK *pStack;
    while((pStack = stack -> next) != NULL){
        free(stack);
        stack = pStack;
    }
}

void push(STACK_TYPE value)
{
    STACK *new = (STACK *)malloc(sizeof(STACK));
    new -> next = stack;
    new -> value = value;
    stack = new;
}

STACK_TYPE pop()
{
    STACK_TYPE value = stack -> value;
    STACK *pStack = stack;
    stack = stack -> next;
    free(pStack);
    return value;
}

int isEmpty()
{
    return stack -> next == NULL ? TRUE : FALSE;
}

stack.c

#include <stdio.h>
#include "stack.h"

int main()
{
    //堆栈
    create_stack();
    push(10);
    push(20);
    push(30);
    pop();
    push(22);
    while(isEmpty() == FALSE){
        printf("%d \t", pop());
    }
}

main.c

运行:

队列:

当使用数组作为队列时,如果只是一端插入一端弹出,那么当尾部没有空间时,便无法插入元素,一种解决方法是使用“环绕”数组,新元素可以存储到以前删除元素所留出来的空间中,这种方法称为循环数组。

循环数组有个问题,当队列为空,或者为满时,首位的下标是一样的,无法判断出此时队列的状态,所以在队列的rear后加一个空余的不使用的位置,用来判断队列的状态是满队列,还是空队列。

当为满队列时:

(rear + 2) % QUEUE_SIZE  = front

当为空队列时:

(rear + 1) % QUEUE_SIZE = front

队列实现:

//
// Created by mao on 16-9-16.
//

#ifndef UNTITLED_QUEUE_H
#define UNTITLED_QUEUE_H
#define TRUE  1
#define FALSE 0
#define QUEUE_SIZE 100
#define ARRAY_SIZE (QUEUE_SIZE + 1)
typedef int QUEUE_TYPE;

static QUEUE_TYPE queue[ARRAY_SIZE];
static int front = 1;
static int rear = 0;

void Q_delete();
QUEUE_TYPE Q_first();
void Q_insert(QUEUE_TYPE value);
int Q_isEmpty();
int Q_isFull();
#endif //UNTITLED_QUEUE_H

queue.h

//
// Created by mao on 16-9-16.
//

#include "queue.h"
#include <assert.h>

void Q_delete()
{
    assert(Q_isEmpty() == FALSE);
    front = (front + 1) % QUEUE_SIZE;
    front = (front) % QUEUE_SIZE;
}

QUEUE_TYPE Q_first()
{
    assert(Q_isEmpty() == FALSE);
    return queue[front];
}

//队列插入数据,rear++
void Q_insert(QUEUE_TYPE value)
{
    assert(Q_isFull() == FALSE);
    rear = (rear + 1) % QUEUE_SIZE;
    queue[(rear) % QUEUE_SIZE] = value;
}

int Q_isEmpty()
{
    return (rear + 1) % QUEUE_SIZE == front ? TRUE: FALSE;
}

int Q_isFull()
{
    return (rear + 2) % QUEUE_SIZE == front ? TRUE : FALSE;
}

queue.c

#include <stdio.h>
#include "queue.h"

int main()
{

    //插入队列
    Q_insert(10);
    Q_insert(12);
    Q_delete();
    Q_insert(22);
    Q_insert(30);
    printf("%d\n", Q_first());
    Q_delete();
    printf("%d\n", Q_first());
    Q_delete();
    printf("%d\n", Q_first());
    Q_delete();

    return 1;
}

main.c

运行:

二叉树:

时间: 2024-10-10 15:09:53

C和指针 第十七章 经典数据类型的相关文章

C#高级编程第11版 - 第十七章

导航 C# 全版本特性一览 全书目录 第十七章 Managed and Unmanaged Memory 17.1 内存 348 17.2 后台内存管理 349 17.2.1 值数据类型 349 17.2.2 引用数据类型 350 17.2.3 垃圾收集 352 17.3 强引用和弱引用 354 17.4 处理非托管的资源 354 17.4.1 析构函数或终结器 355 17.4.2 IDisposable 接口 356 17.4.3 using 语句 356 17.4.4 实现IDisposa

Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41204073 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十七章 内存管理和自动计数

本书第十六章讲解的时关于文件和目录的操作,内容相对简单,再次略过. 第十七章的学习笔记经本人归纳整理呈献给大家. 内存管理: - 为了被占用的内存能够再次利用,通过内存管理清理不用的内存.如果一个对象不再使用,就需要释放对象占用的内存 Part 1. 基本内存管理模型 Part 1.1 自动垃圾收集: 系统能够自动贾策对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对象会被自动释放 Part 1.2 手工管理内存计数: 每当创建引用到对象的时候需要为引用数+1.[myFractio

第十七章 特殊类成员

第十七章  特殊类成员 1.1  静态成员变量 假如我们要在一个类中的所有对象间共享某种数据,那不妨将其设置为静态成员变量/函数: static x 1.2  静态成员变量 静态成员变量与成员变量有4点不同: ①前者属于类②前者必须在全局定义③前者被调用只用说明那个类即可④前者在没有创建对象之前就已经存在 #include <iostream> using namespace std; class A { public: static int n; }; int A::n=0; //要使用类成

读《构建之法》第四章 、第十七章

第四章    两人合作 通过对于<构建之法>第四章的阅读使我对代码规范 . 代码复审 . 以及结对编程有了更加深刻的认识,所谓代码规范可以分为两个部分,代码风格规范和代码设计规范,代码风格规范的原则是:简明 . 易读 . 无二义性,代码书写的形式,变量命名的方法,注释程序如何工作都有详细的介绍,令我受益颇多.代码设计规范不光是程序书写的格式问题,而且牵涉到咸亨需设计 . 模块之间的联系 . 设计模式等方方面面,函数的设计,语句的使用,错误的处理,这些都是我们在进行程序设计的时候需要注意的地方.

阅读《构建之法》第四章、第十七章收获

阅读<构建之法>第四章.第十七章 阅读这一章的时候,我意识到了很多以前写程序没有注意到的地方,以前写程序就只知道能运行就好,根本不管自己写的程序占多少内存,运行的时间,是否有优化的空间,写代码的时候也不注意规范,有时候设计的函数根本用不上,造成代码冗余.同时也认识到结对编程的重要性,没读这本书之前就觉得结对编程就是两个人一人负责一个模块,然后合在一起,调试调试.但实则不然,真正的结对编程应该像书中那样,一个是驾驶人,一个是领航人,两个人有规律的进行编程.期间,一人编程一人复审,极大地提高了效率

第九章构造数据类型实验

---恢复内容开始--- 第九章构造数据类型实验 一.实验项目: 1.结构体变量的应用. 2.结构体数组的应用. 3.共用体的应用. 4.机构体指针的应用. 姓名:李儿龙    实验地点:教学楼514教室     实验时间:6月28日 二.实验目的 1.巩固学生对结构体这种数据机构概念的理解,增强程序设计能力. 2.巩固学生对结构体这种数据机构概念的理解,增强程序设计能力. 3.巩固学生对结构体.共用体这种数据机构概念的理解,增强程序设计能力. 4.巩固学生对结构体这种数据机构概念的理解,增强程

第三章 经典算法

第三章  经典算法 0  写在前面 本章介绍了 SVM,逻辑回归和决策树 三个经典算法.这三个算法在李航的<统计学习方法>中分别拿出了三章重点讲解.本节的提问需要有相应的基础,通过书中的提问发现自己基础太弱了,而基础知识最能考察一个人的学习能力.(记得考研时张宇说过,基础知识不等于简单知识,越是抽象的基础知识越困难,双手赞成!)<百面机器学习>是本很好的书,一遍远远不够,鉴于时间和需求不同,第一遍暂时快速浏览,从宏观把我覆盖的知识点. 1 支持向量机SVM 关于SVM的介绍,网上有

第十七章

太上,下知有之:其次,亲誉之:其次,畏之:其下,侮之.信不足焉,有不信.犹呵,其贵言也.成功遂事,而百姓谓我自然. 第十七章1 管理者的四境界之最高境界 各位朋友大家好,今天我们接着来学习<道德经>,这几天我是在新加坡讲课,在跟大家分享<道德经>的同时,白天还要讲课. 新加坡是一个非常安静的.非常有序的国家,现代化程度非常高.因为我会经常来讲课,所以我发现新加坡有很多地方是值得我们学习的,这个有机会跟大家慢慢聊. 今天我们开始讲<道德经>的第十七章.这章有意思了,这章讲