📄 arithmetic.h
字号:
/*
*文件:arithmetic.h
*作者:黄峰
*日期:
*描述:提供基本算法的头文件
*Copyright (C) 2002,深圳宝利达实业有限公司
*/
#ifndef _ARITHMETIC_H
#define _ARITHMETIC_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <unistd.h>
#include <pthread.h>
#include <math.h>
#include "../include/types.h"
//指令缓冲池结构定义
typedef struct comm_buf {
STR_COMM accept_comm;
struct comm_buf *next;
} COMM_BUF;
typedef COMM_BUF *COMM_LIST;
//发送指令缓冲池结构定义
typedef struct send_buf {
STR_SEND send_comm;
struct send_buf *next;
} SEND_BUF;
typedef SEND_BUF *SEND_LIST;
//定义临时接收缓冲节点
typedef struct tty_buf {
BYTE data;
struct tty_buf *next;
} TTY_BUF;
typedef TTY_BUF *TTY_LIST;
//一般算法
WORD chksum_generate(WORD * p_data, WORD i_datalength); //校验和计算
WORD swap_word(WORD word_reverse); //转换字排列顺序的转换算法
UINT32 BCDtoDEC(BYTE * bcd_source, UINT32 len); //BCD码转换成十进制算法
INT8 get_bit_value(int status, INT8 bit); //取指定位置的寄存器值
//指令缓冲池处理函数
int add_comm(void *pr_comm, int m_type); //增加指令到缓冲池
int get_comm(void *pr_comm, int m_type); //从缓冲池取指令
void free_buf(void); //释放缓冲池
void tty_data_add(BYTE * m_data, int len); //增加接收数据到串口接收临时缓冲区
int tty_data_get(BYTE * m_data, int len); //从缓冲区取指定长度的节点
int tty_data_seek(BYTE * m_data, int len);
void tty_data_free(void); //释放缓冲池
//*********************************************************
//平衡二叉树算法
/** AVL结点定义 **/
struct tree {
unsigned char *Key; /* 结点关键字 */
void *Field; /* 结点所包含的域指针 */
struct tree *left_pointer; /* 指向左儿子指针 */
struct tree *right_pointer; /* 指向右儿子指针 */
char bf; /* 平衡因子 */
};
typedef struct tree TREE;
/** 一棵AVL树的信息定义。**/
struct avl {
unsigned short FieldSize; /* 结点中域的大小 */
TREE *Root; /* 此AVL树的根指针 */
TREE *Result; /* 执行AvlSelect后查询结果结点指针 */
unsigned short ErrorCode; /* 错误代码 */
char ErrorInfo[100]; /* 错误文本信息 */
};
typedef struct avl AVL;
typedef struct {
UINT32 process_no; //集中器指令处理序列号
UINT16 insname; //指令码
BYTE serial_no[5]; //主站指令流水号
} STR_SAVE;
//定义需响应指令的保存数据节点
typedef struct { /* 结点的结构定义 */
unsigned char Key[6]; /* 结点主键,必须是字符串,再这儿以指令的序列号代替 */
STR_SAVE save_flag; /* 保存发送指令标志 */
} SAVE_NODE;
#define RESULT(x,y,z) (((x *)(y->Result->Field))->z) // 获取查询结果域的一个字段(x:域结构,y:AVL树指针,z:域字段名称)
#define FIELD(x,y,z) (((x *)(y->Field))->z) // 一个AVL结点域的一个字段的获取(x:域结构,y:AVL结点指针,z:域字段名称)
void AvlInit(AVL * prTree, unsigned short FdSize); // 初始化一棵AVL树
void AvlFree(AVL * prTree); // 释放一棵AVL树
void AvlUpdate(AVL * prTree, unsigned char *OldKey, unsigned char *NewKey,
void *NewFd);
//变更AVL树中一个结点的关键域
void AvlSelect(AVL * prTree, TREE * ptr, unsigned char *Key); //从一棵AVL树中查询数据
void AvlInsert(AVL * prTree, void *NewFd, unsigned char *NewKey); // 向一棵AVL树中插入一个结点
void AvlExport(AVL * prTree, TREE * ptr, void (*Func) (TREE * ptr1)); //以升序遍历一棵AVL树
int AvlDelete(AVL * prTree, unsigned char *OldKey); //删除一棵AVL树中一个结点
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -