嵌入式day18

2019-08-24  本文已影响0人  小土豆dy

队列的链式存储

typedef int datatype;                       //定义链队列中数据元素的数据类型
typedef struct node{
 datatype data;                 //数据域
 struct node *next;         //链接指针域
}linklist;       //链表元素类型定义
typedef struct{
 linklist *front, *rear;                     //链表元素类型定义
}linqueue;                               //链队列类型定义
linkqueue *q;                        //定义指向连队列的指针
  1. 先写头文件linkqueue.h
#ifndef _LINKQUEUE_H__
#define _LINKQUEUE_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int data_t;   //定义数据类型为int
​
//定义链式队列的结点类型
typedef struct linkqueuenode{
 data_t data;
 struct linkqueuenode *next;
}linkqueue_node, *linkqueue_pnode;
​
//将front和rear指针封装
typedef struct linkqueue
{
 linkqueue_pnode front, rear;
}link_queue, *link_pqueue;
extern void init_linkqueue(link_pqueue *Q);
extern bool in_linkqueue(data_t data, link_pqueue q);
extern bool is_empty_linkqueue(link_pqueue q);
extern bool out_linkqueue(link_pqueue q, data_t *D);
extern void show_linkqueue(link_pqueue q);
  1. 写linkqueue.c
#include "linkqueue.h"
void init_linkqueue(link_pqueue *Q)
{
 *Q = (link_pqueue)malloc(sizeof(link_queue));
 if(NULL == (*Q)){
 perror("malloc");
 exit(-1);
 }
 //申请头结点空间
 (*Q)->front = (linkqueue_pnode)malloc(sizeof(linkqueue_node));
 if(NULL == (*Q)->front){
 perror("malloc");
 exit(-1);
 }
 (*Q)->front->next = NULL;
 (*Q)->rear = (*Q)->front;
}
//入队
bool in_linkqueue(data_t data, link_pqueue q)
{
 linkqueue_pnode new;
 new = (linkqueue_pnode)malloc(sizeof(linkqueue_node));
 if(NULL == new){
 printf("入队失败!\n");
 return false;
 }
 new->data = data;
 new->next = q->rear->next;
 q->rear->next = new;
 q->rear = q->rear->next;
 return true;
}
bool is_empty_linkqueue(link_pqueue q)
{
 if(q->rear == q->front)
 return true;
 else
 return false;
}
bool out_linkqueue(link_pqueue q, data_t *D)
{
 linkqueue_pnode t;
 if(is_empty_linkqueue(q)){
 printf("队列已空!\n");
 return false;
 }
 t = q->front;
 q->front = q->front->next;
 *D = q->front->data;
 free(t);
 return true;
}
void show_linkqueue(link_pqueue q)
{
 linkqueue_pnode p;
 for(p= q->front->next;p!= NULL;p=p->next)
 printf("%d\t", p->data);
 printf("\n");
}
  1. 写测试程序test.c
/*
 *用链式队列实现如下功能:用户从键盘输入整数,程序将其入队,用户输入字母,程序将队头元素出队,并在每一次出队和入队之后打印队列元素。
 */
#include "linkqueue.h"
int main(void)
{
 link_pqueue q;
 data_t data, t;
 int ret;
 init_linkqueue(&q);
 while(1){
 printf("请输入一个整数:");
 ret = scanf("%d", &data);
 if(ret == 1){
 if(in_linkqueue(data, q))
 show_linkqueue(q);
 }else{
 if(out_linkqueue(q, &t)){
 printf("out:%d\n", t);
 show_linkqueue(q);
 } 
 while(getchar()!= '\n');
 }
 }
 return 0;
}
  1. 写Makefile文件
CC = gcc
CFLAGS = -Wall -g -o0
SRC = linkqueue.c test.c
OBJS = test
$(OBJS):$(SRC)
 $(CC) $(CFLAGS) -o $@ $^
.PHONY:
 clean
clean:
 $(RM) $(OBJS) .*.sw?

结果:

树与二叉树

树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件:

树的定义是递归定义

二叉树的概念

二叉树是n(n≥0)个节点的有限集合,它或者是空集(n=0),或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。二叉树与普通书有序数不同,二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。

二叉树的性质

上一篇 下一篇

猜你喜欢

热点阅读