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

Posted 日拱一卒,功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

运行:

技术分享

二叉树:

 

以上是关于C和指针 第十七章 经典数据类型的主要内容,如果未能解决你的问题,请参考以下文章

读构建之法第十七章有感(作业四)

WPF学习第十七章 鼠标输入

第十七章:组合查询

《Linux课本》读书笔记 第十七章 模块

第十七章 Python网络编程

第十七章 委托