算法代码(转)
动态内存分配算法
- /* 工程名称: W32_Alloc */
- /* Alloc.h */
- #ifndef __ALLOC_H
- #define __ALLOC_H
- #include "Alloc.cpp"
- #endif
- /* Alloc.cpp */
- typedef unsigned int WORD;
- typedef enum { sUsed = 1, sFree = 0 } blk_state;
- typedef struct mcb {
- blk_state s; /* block state */
- WORD *pBegin; /* begining of allocated address */
- WORD *pEnd; /* ending of allocated address */
- size_t size; /* allocated size */
- struct mcb *next;
- struct mcb *prev;
- } mcb_t; /* memory control block */
- typedef struct {
- mcb_t *blk_head; /* mcb linked-list head and tail */
- mcb_t *blk_tail;
- WORD *blk_free; /* free block ptr */
- WORD *ptos; /* pointer of stack top */
- size_t stack_size; /* stack size */
- size_t used_size; /* used size */
- } mcbc_t; /* memory control block container */
- mcbc_t *c; /* global container */
- inline mcbc_t *
- init_container( WORD *ptos, int stack_size ) {
- mcbc_t *ret = (mcbc_t *)malloc(sizeof(mcbc_t));
- assert(ret);
- ret->ptos = ptos;
- ret->blk_head = (mcb_t *)0;
- ret->blk_tail = (mcb_t *)0;
- ret->blk_free = ptos;
- ret->stack_size = stack_size;
- ret->used_size = (int)0;
- return ret;
- }
- inline void
- bind_container( mcbc_t *con ) {
- c = con;
- }
- inline void
- throw_container( void ) {
- mcb_t *p, *bak;
- if(c) {
- /* free linked-list */
- p = c->blk_head;
- while(p) {
- bak = p->next;
- free(p);
- p = bak;
- }
- /* free container */
- free(c);
- c = (mcbc_t *)0;
- }
- }
- inline void *
- allocate( size_t size ) {
- assert(c); /* ensure container has been binded */
- size_t reminder = c->stack_size - c->used_size; /* calc reminder */
- size_t split_size;
- size_t ss;
- mcb_t *p, *bak;
- void *ret;
- if(!size)
- return (void *)0;
- /* general size convert to stack offset */
- if(!(size % sizeof(WORD)))
- ss = size / sizeof(WORD);
- else
- ss = size / sizeof(WORD) + 1;
- if( reminder < ss )
- return (void *)0; /* not enough space for allocating */
- if(!c->blk_head) {
- /* no mcb in linked-list, create one */
- p = (mcb_t *)malloc(sizeof(mcb_t));
- assert(p);
- ret = (void *)c->ptos;
- c->blk_free += ss;
- c->used_size += ss;
- p->pBegin = c->ptos;
- p->pEnd = c->blk_free;
- p->s = sUsed;
- p->size = size;
- p->next = (mcb_t *)0;
- p->prev = (mcb_t *)0;
- c->blk_head = c->blk_tail = p;
- return ret;
- }
- else {
- /* find free block */
- p = c->blk_head;
- while(p) {
- if(p->size >= ss && p->s == sFree) {
- ret = (void *)p->pBegin;
- /* p->size > ss, split it! */
- if(p->size > ss) {
- split_size = p->size - ss;
- /* recalc end boundary */
- p->pEnd = (WORD *)(p->pBegin + ss);
- p->size = ss;
- p->s = sUsed;
- bak = (mcb_t *)malloc(sizeof(mcb_t));
- assert(bak);
- /* insert mcb */
- bak->prev = p;
- if(p->next) {
- p->next->prev = bak;
- bak->next = p->next;
- }
- else {
- bak->next = (mcb_t *)0;
- c->blk_tail = bak;
- }
- p->next = bak;
- /* constructing a splited control block */
- bak->pBegin = p->pEnd;
- bak->pEnd = (WORD *)(bak->pBegin + split_size);
- bak->size = split_size;
- bak->s = sFree;
- }
- else
- p->s = sUsed;
- c->used_size += ss;
- return ret;
- }
- p = p->next;
- }
- /* no matched block, create one at tail */
- ret = (void *)c->blk_free;
- c->blk_free += ss;
- c->used_size += ss;
- p = (mcb_t *)malloc(sizeof(mcb_t));
- assert(p);
- p->pBegin = (WORD *)ret;
- p->pEnd = c->blk_free;
- p->prev = c->blk_tail;
- p->next = (mcb_t *)0;
- p->size = ss;
- p->s = sUsed;
- c->blk_tail->next = p;
- c->blk_tail = p;
- return ret;
- }
- }
- inline int
- release( void *ptr ) {
- assert(c);
- mcb_t *p = (mcb_t *)0;
- mcb_t *pLeft = (mcb_t *)0;
- mcb_t *pRight = (mcb_t *)0;
- p = c->blk_head;
- while(p) {
- /* free matched block */
- if(p->pBegin == (WORD *)ptr) {
- p->s = sFree;
- c->used_size -= p->size;
- /* merge free neighbours */
- pLeft = p->prev;
- pRight = p->next;
- while( (pLeft && pLeft->s == sFree) || (pRight && pRight->s == sFree) ) {
- /* merge left neighbour */
- if(pLeft && pLeft->s == sFree) {
- p->pBegin = pLeft->pBegin;
- p->size += pLeft->size;
- /* destory left neighbour */
- p->prev = pLeft->prev;
- if(pLeft->prev)
- pLeft->prev->next = p;
- else
- c->blk_head = p;
- free(pLeft);
- }
- /* merge right neighbour */
- if(pRight && pRight->s == sFree) {
- p->pEnd = pRight->pEnd;
- p->size += pRight->size;
- /* destory right neighbour */
- p->next = pRight->next;
- if(pRight->next)
- pRight->next->prev = p;
- else
- c->blk_tail = p;
- free(pRight);
- }
- /* reload neighbours */
- pLeft = p->prev;
- pRight = p->next;
- }
- /* on success */
- return 0;
- }
- p = p->next;
- }
- /* no block matched */
- return 1;
- }
- /* main.cpp */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- #include <assert.h>
- #include "Alloc.h"
- WORD stk[8 * 1024]; /* 16Kbytes */
- int main() {
- char *s1,*s2,*s3;
- mcbc_t *con = init_container(stk, 8*1024);
- bind_container(con);
- s1 = (char *)allocate(12);
- s2 = (char *)allocate(4);
- s3 = (char *)allocate(5);
- strcpy(s1,"Hello,world");
- strcpy(s2,"ABC");
- strcpy(s3,"1234");
- printf("%s,%s,%s\n",s1,s2,s3);
- getch();
- release((void *)s1);
- release((void *)s2);
- s1 = (char *)allocate(16);
- strcpy(s1,"Hello,world,ABC");
- printf("%s %s %s\n",s1,s2,s3);
- getch();
- release((void *)s1);
- release((void *)s3);
- throw_container();
- return 0;
- }
A*算法
- /* 工程名称: W32_AStar */
- /* AStar.h */
- /* 设计者: yuki */
- #ifndef __ASTAR_H
- #define __ASTAR_H
- #define MAZE_WIDTH 10 /* 迷宫宽度 */
- #define MAZE_HEIGHT 10 /* 迷宫高度 */
- #define PATH_BLOCK 0 /* 障碍物 */
- #define PATH_WALKON 1 /* 可行走 */
- #define PATH_FOOTPRINT 2 /* 脚印 */
- #include "AStar.cpp"
- #endif
- /* AStar.cpp */
- /* 设计者: yuki */
- typedef unsigned char byte_t;
- typedef unsigned int uint_t;
- /* 路径节点 */
- typedef struct footprint {
- /* 存放在数组中的位置 */
- uint_t pos;
- /* 存放方向信号量 */
- byte_t direct;
- struct footprint *next;
- struct footprint *prev;
- } path_t;
- /*
- 方向信号量查询表
- 0x01(0000 0001) : 上
- 0x02(0000 0010) : 下
- 0x04(0000 0100) : 左
- 0x08(0000 1000) : 右
- */
- static byte_t d_signal[4] = {0x01, 0x02, 0x04, 0x08};
- /*
- 方向信号量使用表
- 如果指定方向已经走过,那么使用“与”运算去处该方向
- 0x0E(0000 1110) : 上
- 0x0D(0000 1101) : 下
- 0x0B(0000 1011) : 左
- 0x07(0000 0111) : 右
- */
- static byte_t d_spend[4] = {0x0E, 0x0D, 0x0B, 0x07};
- /* 指定方向移动偏量 */
- static int move[4][2] = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };
- /* 打印迷宫用的符号 */
- static byte_t symbolic[3] = {'#',0x20,'*'};
- /* 求两点间的距离 */
- inline uint_t
- distance( uint_t pos1X, uint_t pos1Y, uint_t pos2X, uint_t pos2Y ) {
- uint_t ret = 0;
- /* 距离公式 */
- ret = (uint_t)sqrt((pow((double)((int)pos1X - (int)pos2X),2) + pow((double)((int)pos1Y - (int)pos2Y),2)));
- return ret;
- }
- /* 压缩坐标 */
- inline uint_t
- create_pos( uint_t pX, uint_t pY ) {
- uint_t ret = 0;
- /* 将pX赋给ret,这样pX坐标在ret的低八位 */
- ret = pX;
- /* 将pX坐标移到高八位去,这样低位就能存放pY */
- ret <<= 8;
- /* 将pY存放放到ret的低八位,并保持高八位的数据不变 */
- ret |= pY;
- return ret;
- }
- /*
- == 估计函数 ===========================================
- -p : 当前移动到的节点指针
- -quit_x
- -quit_y : quit_x 和 quit_y表示迷宫出口坐标
- -maze : 迷宫矩阵
- =======================================================
- */
- inline path_t *
- evaluate( path_t *p, uint_t quit_x, uint_t quit_y, byte_t maze[MAZE_HEIGHT][MAZE_WIDTH] ) {
- uint_t pX, pY;
- /* 用于接收四个方向离开出口的距离,以便选择最近的方向移动 */
- int dis[4];
- int minDis = 32767;
- int minId = -1;
- path_t *pnode = (path_t *)0;
- register int i;
- /* 计算当前节点的坐标 */
- pX = p->pos >> 8;
- pY = p->pos & 0x00FF;
- memset(dis, (int)-1, sizeof(int)*4);
- /* 计算每个方向离开出口的距离,一次存放到dis数组,若没有i方向,则dis[i]任保留-1 */
- for( i = 0; i < 4; ++i ) {
- if( (p->direct & d_signal[i]) >> i == 0x01 )
- dis[i] =(int)distance(pX + move[i][0], pY + move[i][1], quit_x, quit_y);
- }
- /* 获得最短距离的方向 */
- for(i = 0; i < 4; ++i) {
- if(dis[i] != -1 && dis[i] < minDis) {
- minId = i;
- minDis = dis[i];
- }
- }
- /* 若没有可用的方向,则通知寻径函数折回 */
- if(minId == -1)
- return (path_t *)0;
- /* 用去最近距离方向的信号量 */
- p->direct &= d_spend[minId];
- /* 在移动到新位置之前,在旧位置处留下足迹 */
- maze[pY][pX] = (byte_t)PATH_FOOTPRINT;
- /* 构建新的路径节点 */
- pnode = (path_t *)malloc(sizeof(path_t));
- assert(pnode);
- /* 计算下一个位置的坐标 */
- pX += move[minId][0];
- pY += move[minId][1];
- pnode->pos = create_pos(pX, pY);
- pnode->prev = p;
- pnode->next = (path_t *)0;
- pnode->direct = 0;
- /* 在新位置处,计算下一个位置可用的移动方向 */
- for(i = 0; i < 4; ++i) {
- if(maze[pY + move[i][1]][pX + move[i][0]] != PATH_BLOCK && maze[pY + move[i][1]][pX + move[i][0]] != PATH_FOOTPRINT) {
- /* 若尝试的下一个位置不是障碍物或自己走过的足迹,则视为可用方向,获得该方向的信号量 */
- pnode->direct |= d_signal[i];
- }
- }
- return pnode;
- }
- /*
- == A*算法寻径函数 ===========================================
- -eX
- -eY :入口坐标
- -qX
- -qY :出口坐标
- -maze :迷宫矩阵
- =============================================================
- */
- inline path_t *
- AStar(uint_t eX, uint_t eY, uint_t qX, uint_t qY, byte_t maze[MAZE_HEIGHT][MAZE_WIDTH]) {
- register int i;
- /* 压缩坐标 */
- uint_t quit_pos = create_pos(qX, qY);
- /* 构建入口路径节点,视为路径链的头 */
- path_t *head = (path_t *)malloc(sizeof(path_t));
- path_t *p = (path_t *)0;
- path_t *back = (path_t *)0;
- assert(head);
- p = head;
- p->direct = 0;
- p->pos = create_pos(eX,eY);
- p->next = (path_t *)0;
- p->prev = (path_t *)0;
- /* 创建入口处的可用方向 */
- for(i = 0; i < 4; ++i) {
- if(maze[eY + move[i][1]][eX + move[i][0]] != PATH_BLOCK)
- /* 若无障碍物则获得该方向的信号量 */
- p->direct |= d_signal[i];
- }
- do {
- /* 获得下个路径的节点指针 */
- back = evaluate(p, qX, qY, maze);
- if(back) {
- p->next = back;
- p = p->next;
- }
- /* 无路可走则折回 */
- if(p->direct == 0 && p != head && p->pos != quit_pos) {
- back = p->prev;
- back->next = (path_t *)0;
- /* 清楚脚印 */
- maze[p->pos & 0x00FF][p->pos >> 8] = (byte_t)PATH_WALKON;
- free(p);
- p = back;
- }
- /* 若走不出迷宫,即折回到入口,且入口处的可用方向全部尝试过 */
- if(p == head && p->direct == 0) {
- free(head);
- return (path_t *)0;
- }
- } while( p->pos != quit_pos );
- /* 在出口处留下脚印,便于打印 */
- maze[p->pos & 0x00FF][p->pos >> 8] = (byte_t)PATH_FOOTPRINT;
- return head;
- }
- /* main.cpp */
- /* 设计者: yuki */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- #include <math.h>
- #include <assert.h>
- #include "AStar.h"
- static byte_t maze[MAZE_HEIGHT][MAZE_WIDTH] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 1, 0, 1, 1, 1, 0, 1, 0,
- 0, 1, 1, 0, 1, 1, 1, 0, 1, 0,
- 0, 1, 1, 1, 1, 0, 0, 0, 1, 0,
- 0, 1, 0, 0, 0, 1, 1, 0, 1, 0,
- 0, 1, 1, 1, 0, 1, 1, 0, 1, 0,
- 0, 1, 0, 1, 1, 1, 0, 1, 1, 0,
- 0, 1, 0, 0, 0, 1, 0, 0, 1, 0,
- 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
- int main() {
- register int i,j;
- path_t *pHead = AStar((uint_t)1,(uint_t)1,(uint_t)2,(uint_t)8,maze);
- path_t *p = pHead;
- path_t *bak;
- if(p) {
- bak = p->next;
- printf("(%u,%u)",p->pos >> 8, p->pos & 0x00FF);
- free(p);
- p = bak;
- while(p) {
- bak = p->next;
- printf("->(%u,%u)",p->pos >> 8, p->pos & 0x00FF);
- free(p);
- p = bak;
- }
- printf("\n");
- }
- else
- printf("No path to get out of the maze\n");
- pHead = p = bak = (path_t *)0;
- /* 打印迷宫 */
- for(i = 0; i < MAZE_HEIGHT; ++i) {
- for(j = 0; j < MAZE_WIDTH; ++j)
- printf("%c",symbolic[maze[i][j]]);
- printf("\n");
- }
- getch();
- return 0;
- }
表达式计算器
- /* 工程名称: W32_Expr */
- /* Expr.h */
- #ifndef __EXPR_H
- #define __EXPR_H
- #define TRUE 0x01
- #define FALSE 0x00
- #define OP_PRIOR_LESS_TO 0x00
- #define OP_PRIOR_GREATER_THAN 0x01
- #define OP_PRIOR_EQUAL_TO 0x02
- #define STACK_SIZE 64
- #define BUFFER_SIZE 16
- #include "Expr.cpp"
- #endif
- /* Expr.cpp */
- typedef unsigned char op_prior_t;
- typedef unsigned char bool_t;
- typedef int stack_t;
- /* is an operator ? */
- inline bool_t
- is_opr(char c) {
- switch(c) {
- case '+':
- case '-':
- case '*':
- case '/':
- case '(':
- case ')':
- return (bool_t)TRUE;
- default:
- return (bool_t)FALSE;
- }
- }
- /* calc two oprands */
- inline int
- calc_oprand(int opr1, int opr2, char op) {
- switch(op) {
- case '+':
- return opr1 + opr2;
- case '-':
- return opr1 - opr2;
- case '*':
- return opr1 * opr2;
- case '/':
- assert(opr2);
- return opr1 / opr2;
- default:
- return -1;
- }
- }
- /* get prior of operator */
- inline op_prior_t
- get_op_prior(char op) {
- switch(op) {
- case '+':
- case '-':
- return 0;
- case '*':
- case '/':
- return 1;
- default:
- return 0xFF;
- }
- }
- inline int
- cmp_op(char op1, char op2) {
- op_prior_t pop1 = get_op_prior(op1);
- op_prior_t pop2 = get_op_prior(op2);
- assert(pop1 != 0xFF);
- assert(pop2 != 0xFF);
- if(pop1 > pop2)
- return OP_PRIOR_GREATER_THAN;
- else if(pop1 < pop2)
- return OP_PRIOR_LESS_TO;
- else
- return OP_PRIOR_EQUAL_TO;
- }
- /* string length */
- inline int
- strl(char *str) {
- char *p = str;
- while(*p++);
- return (int)(p - str - 1);
- }
- /* 10^n */
- inline int
- pow_ten_n(int n) {
- int ret = 1;
- while(n > 0) {
- ret *= 10;
- --n;
- }
- return ret;
- }
- /* convert string to integer */
- inline int
- str_to_int(char *str) {
- int ret = 0;
- int i = 0;
- int len = strl(str);
- if(*str == '-' || *str == '+') {
- ++i;
- --len;
- }
- while(len > 0) {
- ret += (*(str + i) - '0') * pow_ten_n(len-1);
- ++i;
- --len;
- }
- if(*str == '-')
- return (-1) * ret;
- return ret;
- }
- inline int
- calc_expr(char *exp) {
- /* test express whether it is vaild */
- assert(exp);
- /* stack of oprands */
- stack_t stk_opr[STACK_SIZE];
- /* stack of operators */
- stack_t stk_op[STACK_SIZE];
- /* oprand1 & oprand2 */
- int opr1 = 0;
- int opr2 = 0;
- int cmp_ret;
- /* buffer */
- char buffer[BUFFER_SIZE];
- /* expression length */
- int len = strl(exp);
- /* counters */
- register int i,j;
- /* stack pointer */
- stack_t *pOpr = stk_opr;
- stack_t *pOp = stk_op;
- /* initialize buffer & stacks */
- memset(buffer, (char)0, sizeof(char) * BUFFER_SIZE);
- memset(stk_opr,(stack_t)0,sizeof(stack_t) * STACK_SIZE);
- memset(stk_op, (stack_t)0,sizeof(stack_t) * STACK_SIZE);
- /* get the first value */
- if(is_opr(*exp) && (*exp == '+' || *exp == '-')) {
- *buffer = *exp;
- i = 1;
- j = 1;
- }
- else {
- i = 0;
- j = 0;
- }
- while(!is_opr(exp[i]))
- buffer[j++] = exp[i++];
- if(i > 0) {
- /* push the first oprand to oprands stack */
- *pOpr = str_to_int(buffer);
- /* clean up buffer */
- memset(buffer, (char)0, sizeof(char) * BUFFER_SIZE);
- /* reset buffer pointer 'j' */
- j = 0;
- }
- /* push the first operator */
- if(exp[i] != '\0')
- *pOp = exp[i++];
- while(exp[i]) {
- /* if exp[i] is not an operator, than get the value */
- if(!is_opr(exp[i])) {
- while(!is_opr(exp[i]) && exp[i] != '\0')
- buffer[j++] = exp[i++];
- ++pOpr;
- *pOpr = str_to_int(buffer);
- memset(buffer, (char)0, sizeof(char) * BUFFER_SIZE);
- j = 0;
- }
- else {
- if(exp[i] == '(') {
- ++pOp;
- *pOp = exp[i++];
- }
- else if(exp[i] != ')') {
- if(*pOp != '(') {
- cmp_ret = cmp_op(*pOp,exp[i]);
- if(cmp_ret == OP_PRIOR_GREATER_THAN || cmp_ret == OP_PRIOR_EQUAL_TO) {
- /* pop two oprands to calc and than push the result to the stack */
- opr2 = *pOpr--;
- opr1 = *pOpr;
- *pOpr = calc_oprand(opr1,opr2,*pOp);
- /* push the low priority operator */
- *pOp = exp[i++];
- }
- else if(cmp_ret == OP_PRIOR_LESS_TO) {
- /* push the high priority operator */
- ++pOp;
- *pOp = exp[i++];
- }
- }
- else {
- ++pOp;
- *pOp = exp[i++];
- }
- }
- else {
- /* loop until a ')' matched with */
- while(*pOp != '(') {
- opr2 = *pOpr--;
- opr1 = *pOpr;
- *pOpr = calc_oprand(opr1,opr2,*pOp);
- /* pop the operator */
- *pOp-- = (char)0;
- if(pOp == stk_op && *pOp != '(') {
- printf("No '(' matched in expression!\n");
- getch();
- exit(1);
- }
- }
- /* pop the '(',and let the expression move on */
- if(pOp > stk_op)
- *pOp-- = (char)0;
- else
- *pOp = (char)0;
- ++i;
- }
- }
- }
- while(pOp >= stk_op) {
- opr2 = *pOpr--;
- opr1 = *pOpr;
- *pOpr = calc_oprand(opr1,opr2,*pOp);
- *pOp-- = (char)0;
- }
- return *stk_opr;
- }
- /* main.cpp */
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <conio.h>
- #include <string.h>
- #include "Expr.h"
- int main() {
- char exp[80];
- printf("Input an expression\n");
- gets(exp);
- printf("= %d\n",calc_expr(exp));
- getch();
- return 0;
- }
广义表的演示
- /* 工程名称: W32_GList */
- /* GList.h */
- #ifndef __GLIST_H
- #define __GLIST_H
- #include "Glist.cpp"
- #endif
- /* GList.cpp */
- #define NODE_ELEMENT 0x00
- #define NODE_LIST 0x01
- typedef unsigned char node_type_t;
- typedef unsigned int index_t;
- typedef struct {
- index_t id_x;
- index_t id_y;
- } locator_t;
- typedef struct GList {
- node_type_t lst_type;
- char *menu;
- int item_count;
- union {
- locator_t loc;
- struct GList *sub_list;
- } data_item;
- struct Glist *next;
- } list_t;
- static char *description[3][2] = { "Black Eyes", "Blue Eyes" ,
- "Tall Body" , "Short Body" ,
- "Fat Body" , "Thin Body"
- };
- static char *meu_list[] = {"== Describe yourself ==\n1. Eye\n2. Height\n3. Figure\n0. Exit\nMake your choice : ",
- "== Your eye color ==\n1. Black\n2. Blue\n0. Exit\nMake your choice : " ,
- "== Your height ==\n1. Tall\n2. Short\n0. Exit\nMake your choice : " ,
- "== Your figure ==\n1. Fat\n2. Thin\n0. Exit\nMake your choice : "
- };
- list_t *dialog_sheet = (list_t *)0;
- list_t *static_dialog_sheet[4];
- char image[256] = "You have ";
- inline list_t *
- create_glist( void ) {
- register int i,j;
- list_t *ret = (list_t *)malloc(sizeof(list_t));
- list_t *p;
- list_t *q;
- /* create the first sheet */
- ret->lst_type = NODE_LIST;
- ret->menu = meu_list[0];
- ret->item_count = 4;
- ret->data_item.sub_list = (list_t *)0;
- p = ret;
- for(i = 1; i < 4; ++i) {
- p->next = (struct Glist *)malloc(sizeof(list_t));
- p = (list_t *)p->next;
- p->menu = meu_list[i];
- p->lst_type = NODE_LIST;
- p->item_count = 3;
- }
- p->next = (struct Glist *)0;
- p = (list_t *)ret->next;
- i = 0;
- j = 0;
- while(p) {
- p->data_item.sub_list = (list_t *)malloc(sizeof(list_t));
- q = p->data_item.sub_list;
- q->lst_type = NODE_ELEMENT;
- q->data_item.loc.id_x = (index_t)i;
- q->data_item.loc.id_y = (index_t)j++;
- q->next = (struct Glist *)malloc(sizeof(list_t));
- q = (list_t *)q->next;
- q->lst_type = NODE_ELEMENT;
- q->data_item.loc.id_x = (index_t)i++;
- q->data_item.loc.id_y = (index_t)j;
- q->next = (struct Glist *)0;
- j = 0;
- p = (list_t *)p->next;
- }
- return ret;
- }
- inline void
- destory_list(list_t *lst) {
- list_t *p = lst;
- list_t *q = (list_t *)0;
- while(p) {
- if(p->lst_type == NODE_LIST) {
- q = (list_t *)p->data_item.sub_list;
- if(q)
- destory_list(q);
- }
- q = (list_t *)p->next;
- free(p);
- p = q;
- }
- }
- inline void
- init_dialog_sheet() {
- list_t *p;
- register int i = 0;
- dialog_sheet = create_glist();
- p = dialog_sheet;
- while(p) {
- static_dialog_sheet[i++] = p;
- p = (list_t *)p->next;
- }
- }
- inline void
- debug() {
- list_t *p = (list_t *)dialog_sheet->next;
- list_t *q;
- while(p) {
- q = (list_t *)p->data_item.sub_list;
- printf("(%d,%d)",q->data_item.loc.id_x , q->data_item.loc.id_y);
- q = (list_t *)q->next;
- printf(",(%d,%d)\n",q->data_item.loc.id_x,q->data_item.loc.id_y);
- p = (list_t *)p->next ;
- }
- }
- inline void
- main_menu() {
- int c;
- list_t *p = static_dialog_sheet[0];
- do {
- printf("%s",p->menu);
- scanf("%d",&c);
- if(c >= 1 && c <= 3 ) {
- p = static_dialog_sheet[c];
- do { /* sub menu */
- printf("%s",p->menu);
- scanf("%d",&c);
- if(c == 0) {
- c = 1;
- break;
- }
- else if(c == 1) {
- p = p->data_item.sub_list;
- strcat(image, description[p->data_item.loc.id_x][p->data_item.loc.id_y]);
- strcat(image, " ");
- p = static_dialog_sheet[0];
- break;
- }
- else if(c == 2) {
- p = (list_t *)p->data_item.sub_list->next;
- strcat(image, description[p->data_item.loc.id_x][p->data_item.loc.id_y]);
- strcat(image, " ");
- p = static_dialog_sheet[0];
- break;
- }
- } while( c != 0 );
- }
- } while( c != 0 );
- if(strlen(image) == 9)
- printf("You have nothing!\n");
- else
- printf("%s\n", image);
- }
- /* main.cpp */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <dos.h>
- #include <conio.h>
- #include "Glist.h"
- int main() {
- init_dialog_sheet();
- main_menu();
- destory_list(dialog_sheet);
- getch();
- return 0;
- }
赫夫曼自动编码
- /* 工程名称: W32_Huffman */
- /* Huffman.h */
- #ifndef __HUFFMAN_H
- #define __HUFFMAN_H
- #include "huffman.cpp"
- #endif
- /* Huffman.cpp */
- typedef unsigned int uint_t;
- typedef struct huffman {
- uint_t weight; /* 权值 */
- struct huffman *lchild;
- struct huffman *rchild;
- } HuffmanTreeNode, *PHuffmanNode;
- typedef struct lnklst {
- PHuffmanNode HNode; /* 赫夫曼树 */
- struct lnklst *next;
- struct lnklst *prev;
- } LnkListNode, *PLnkListNode;
- typedef struct {
- uint_t count; /* 树的棵数 */
- PLnkListNode head; /* 链表结构,表示一行赫夫曼树 */
- PLnkListNode tail;
- } LnkList;
- /* ===================================================================================================================== */
- inline PHuffmanNode
- create_huffman_node( uint_t weight ) {
- PHuffmanNode node = (PHuffmanNode)malloc(sizeof(HuffmanTreeNode));
- assert(node);
- /* 确保权值有效 */
- assert(weight > (uint_t)0);
- /* 使用传入的权值初始化赫夫曼结点 */
- node->weight = weight;
- node->lchild = (PHuffmanNode)0;
- node->rchild = (PHuffmanNode)0;
- return node;
- }
- inline PLnkListNode
- create_lnklst_node( PHuffmanNode node ) {
- PLnkListNode lstNode = (PLnkListNode)malloc(sizeof(LnkListNode));
- assert(lstNode);
- /* 初始化链表结点 */
- lstNode->HNode = node;
- lstNode->next = (PLnkListNode)0;
- lstNode->prev = (PLnkListNode)0;
- return lstNode;
- }
- inline void
- add_to_lnklist( LnkList *lst, PLnkListNode lstNode ) {
- /* 却保lstNode有效 */
- assert(lstNode);
- /* 第一次添加结点 */
- if(!lst->head) {
- lst->head = lstNode;
- lst->tail = lstNode;
- lst->count = (uint_t)1;
- }
- else {
- lst->tail->next = lstNode;
- lstNode->prev = lst->tail;
- lst->tail = lstNode;
- ++lst->count;
- }
- }
- inline void
- remove_from_lnklist( LnkList *lst, PLnkListNode lstNode ) {
- /* 辅助结点 */
- PLnkListNode pnode = (PLnkListNode)0;
- assert(lstNode);
- /* 如果结点为链表头 */
- if(lstNode == lst->head) {
- pnode = lstNode->next;
- pnode->prev = (PLnkListNode)0;
- lst->head = pnode;
- --lst->count;
- free(lstNode);
- }
- /* 如果是两表尾部 */
- else if(lstNode == lst->tail) {
- pnode = lstNode->prev;
- pnode->next = (PLnkListNode)0;
- lst->tail = pnode;
- --lst->count;
- free(lstNode);
- }
- else {
- pnode = lstNode->next;
- pnode->prev = lstNode->prev;
- lstNode->prev->next = pnode;
- --lst->count;
- free(lstNode);
- }
- }
- inline void
- find_and_insert( LnkList *lst, PLnkListNode plst ) {
- /* 根据赫夫曼树的节点权值,插入链表的适当位置 */
- PLnkListNode pcur = (PLnkListNode)0;
- if(!lst->head)
- add_to_lnklist(lst,plst);
- else {
- pcur = lst->head;
- while(pcur) {
- if(plst->HNode->weight >= pcur->HNode->weight) {
- if(pcur->next && plst->HNode->weight <= pcur->next->HNode->weight) {
- plst->prev = pcur;
- plst->next = pcur->next;
- pcur->next->prev = plst;
- pcur->next = plst;
- ++lst->count;
- break;
- }
- else if(!pcur->next) {
- add_to_lnklist(lst, plst);
- break;
- }
- }
- pcur = pcur->next;
- }
- }
- }
- /* ===================================================================================================================== */
- inline void
- swap_lnklst_node( PLnkListNode lstNode1, PLnkListNode lstNode2 ) {
- PHuffmanNode pnode = (PHuffmanNode)0;
- assert(lstNode1 && lstNode2);
- /* 交换链表内容 */
- pnode = lstNode1->HNode;
- lstNode1->HNode = lstNode2->HNode;
- lstNode2->HNode = pnode;
- }
- inline void
- select_sort( LnkList *lst ) {
- /* 根据权值做一个从小到大的选择排序 */
- PLnkListNode cmp_node = lst->head;
- PLnkListNode p;
- assert(cmp_node);
- while(cmp_node) {
- p = cmp_node->next;
- while(p) {
- /* 如果目标位置权值比比较位置的权值小,则将它们交换 */
- if(p->HNode->weight < cmp_node->HNode->weight)
- swap_lnklst_node(cmp_node,p);
- p = p->next;
- }
- cmp_node = cmp_node->next;
- }
- }
- /* ===================================================================================================================== */
- inline PHuffmanNode
- merge_tree( PHuffmanNode root1, PHuffmanNode root2 ) {
- /* 合并两棵赫夫曼树,并返回合并后新树根的指针 */
- PHuffmanNode retRoot = (PHuffmanNode)0;
- assert(root1 && root2);
- /* 创建一棵合并后的赫夫曼树 */
- retRoot = create_huffman_node(root1->weight + root2->weight);
- retRoot->lchild = root1;
- retRoot->rchild = root2;
- return retRoot;
- }
- inline void
- destory_tree( PHuffmanNode root ) {
- /* 销毁一棵树 */
- PHuffmanNode plchild, prchild;
- if(root) {
- plchild = root->lchild;
- prchild = root->rchild;
- free(root);
- root = (PHuffmanNode)0;
- destory_tree(plchild);
- destory_tree(prchild);
- }
- }
- /* ===================================================================================================================== */
- inline void
- convert_to_lnklst( LnkList *lst, uint_t Wi[], uint_t size ) {
- /* 将权值数组转换成赫夫曼树并添加到链表 */
- PLnkListNode plstnode = (PLnkListNode)0;
- PHuffmanNode phufnode = (PHuffmanNode)0;
- register uint_t i;
- for(i = 0; i < size; ++i) {
- phufnode = create_huffman_node(Wi[i]);
- plstnode = create_lnklst_node(phufnode);
- add_to_lnklist(lst,plstnode);
- }
- /* 排序链表 */
- select_sort(lst);
- }
- inline PHuffmanNode
- Huffman_code( uint_t Wi[], uint_t size) {
- /* 根据权值数组进行赫夫曼编码,并返回赫夫曼树的树根 */
- LnkList lst;
- PLnkListNode p1,p2,pnode;
- PHuffmanNode phnode;
- /* 初始化链表 */
- lst.count = (uint_t)0;
- lst.head = (PLnkListNode)0;
- lst.tail = (PLnkListNode)0;
- /* 转换链表 */
- convert_to_lnklst(&lst, Wi, size);
- /* 开始合并树 */
- while(lst.count > 1) {
- /* 取两棵根权值最小的树进行合并,并将合并结果写入链表 */
- p1 = lst.head;
- p2 = lst.head->next;
- /* 合并两树 */
- phnode = merge_tree(p1->HNode, p2->HNode);
- /* 为该树创建一个链表节点 */
- pnode = create_lnklst_node(phnode);
- /* 将新树添加入链表 */
- find_and_insert(&lst,pnode);
- /* 删除旧树的两个链表节点 */
- remove_from_lnklist(&lst,p1);
- remove_from_lnklist(&lst,p2);
- }
- /* 工作完成删除链表 */
- /* 首先获取创建的赫夫曼树的根便于返回 */
- phnode = lst.head->HNode;
- pnode = lst.head;
- while(pnode) {
- p1 = pnode->next;
- free(pnode);
- pnode = p1;
- }
- lst.head = lst.tail = (PLnkListNode)0;
- return phnode;
- }
- inline void
- PreOrderTraverse( PHuffmanNode root, uint_t pos, char code[]) {
- if(root) {
- if(!root->lchild && !root->rchild)
- printf("%u is coded to %s\n",root->weight, code);
- code[pos] = '0';
- PreOrderTraverse(root->lchild, pos+1, code);
- code[pos] = '1';
- PreOrderTraverse(root->rchild, pos+1, code);
- }
- }
- /* main.cpp */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include <conio.h>
- #include "huffman.h"
- int main() {
- uint_t n = 0;
- uint_t *Wi = (uint_t *)0;
- register uint_t i;
- char buf[80];
- PHuffmanNode HuffmanTree;
- memset(buf,(char)0,80 * sizeof(char));
- printf("How many weight you wanna import ( 1...65535 ) ? ");
- scanf("%u",&n);
- Wi = (uint_t *)malloc(n * sizeof(uint_t));
- assert(Wi);
- printf("Input weights in turn \n");
- for(i = 0; i < n; ++i)
- scanf("%u",&Wi[i]);
- HuffmanTree = Huffman_code(Wi, n);
- PreOrderTraverse(HuffmanTree,0,buf);
- getch();
- destory_tree(HuffmanTree);
- free(Wi);
- return 0;
- }
KMP模式匹配算法(不用next函数)
- /* 工程名称: W32_KMP */
- /* main.cpp */
- #include <stdio.h>
- #include <conio.h>
- inline int KMP(char *s,char *p);
- int main() {
- char *s1 = "abacabcdabbab";
- char *s2 = "abc";
- printf("index = %d\n",KMP(s1,s2));
- getch();
- return 0;
- }
- /************************************************
- *
- * 函数名: KMP
- *
- * 参数表: s - 主串的指针; p - 模式串的指针
- *
- * 功能介绍: 比较p是否为s的子串,若是则返回在
- * s中起始的索引号。
- *
- ************************************************/
- inline int
- KMP(char *s, char *p) {
- char *ptr_s = s; /* 映射字符串指针s */
- char *ptr_p = p; /* 映射字符串指针p */
- char *ptr_bak = s; /* 用于定位在*ptr_s与*p内容相同的位置 */
- int addr_delta; /* 计算相匹配的内容长度,调整ptr_p对比起始位置 */
- while(*ptr_s && *ptr_p) {
- if(*ptr_s == *ptr_p) {
- /* 如果匹配字符与对比串的首字符相等,则备份该指针 */
- if(*ptr_s == *p)
- ptr_bak = ptr_s;
- ++ptr_s;
- ++ptr_p;
- }
- else {
- /* 计算新位置与备份指针的差,这便是以匹配的字符数,从而使p+addr_delta获得开始匹配的起始位置 */
- addr_delta = (int)(ptr_s - ptr_bak);
- /* 若备份位置与当前位置相同,则将当前位置一下下一个位置,从头开始比较 */
- if(!addr_delta) {
- ++ptr_s;
- ptr_bak = ptr_s;
- ptr_p = p;
- }
- else {
- ptr_p = p + addr_delta;
- /* 若备份位置与模式串的首位置都不匹配当前位置的字符串,则继续向后比较,重设备份位置和匹配位置 */
- if(*ptr_p != *ptr_s && *p != *ptr_s) {
- ++ptr_s;
- ptr_bak = ptr_s;
- ptr_p = p;
- }
- else {
- /* 若备份位置与当前位置字符不匹但与模式串首字符相匹,则重设匹配位置和备份位置 */
- if(*p == *ptr_s) {
- ptr_p = p;
- ptr_bak = ptr_s;
- }
- }
- }
- }
- }
- if(*ptr_p)
- return -1;
- else
- /* 计算索引 */
- return (int)((ptr_s - s) - (ptr_p - p));
- }
一元多项式加减乘
- /* 工程名称: W32_Polynomial */
- /* Polynomial.h */
- #ifndef __POLYNOMIAL_H
- #define __POLYNOMIAL_H
- #define TRUE 0x01
- #define FALSE 0x00
- /* 错误代码 */
- #define ERR_ON_SUCCESS 0x00 /* 没有错误 */
- #define ERR_STACK_OVERRUN 0x01 /* 堆栈溢出 */
- #define ERR_ITEM_EXIST 0x02 /* 欲添加项已存在 */
- #define ERR_PTR_INVAILD 0x04 /* 无效的指针传入 */
- #define ERR_LNKLST_INVAILD 0x08 /* 无效的链表 */
- #define ERR_ACTCODE_INVAILD 0x10 /* 无效的操作码 */
- #define ERR_ADD_IMPOSSIBLE 0x20 /* 无法做加运算 */
- #define ERR_SUB_IMPOSSIBLE 0x40 /* 无法做减运算 */
- #define ERR_EMPTY_POLY 0x80 /* 多项式链表为空 */
- #define ERR_UNKNOWN 0xff /* 位置错误 */
- /* 操作码 */
- #define ACT_ADD 0x01 /* 多项式加 */
- #define ACT_SUB 0x02 /* 多项式减 */
- #define ACT_MUP 0x03 /* 多项式乘 */
- /* 嵌入式功能配置常数 */
- #define AUTO_DESTORY_EXIST FALSE /* 欲插入的项已存在时,自动删除创建的项 */
- #define CHK_PARAMETER_PTR TRUE /* 检查作为参数传入的指针是否有效 */
- #define RAISE_ERR TRUE /* 错误报告函数 */
- #define CRITICAL_ABORT TRUE /* 错误异常中断 */
- #define COPY_LNKLST TRUE /* 链表复制函数 */
- #define SIMPLE_OUTPUT TRUE /* 简单的多项式输出函数 */
- #define SIMPLE_INPUT TRUE /* 简单的多项式输入函数 */
- #define EPSILON 1E-6 /* 极小值定义,用于浮点数趋近比较 */
- #include "Polynomial.cpp"
- #endif
- /* Polynomial.cpp */
- typedef struct Polynomial {
- float p;
- int e;
- struct Polynomial *next;
- struct Polynomial *prev;
- } poly;
- typedef struct {
- poly *head;
- poly *tail;
- int length;
- } poly_lnklst;
- typedef unsigned int uint;
- #if RAISE_ERR == TRUE
- inline void
- raise_err(uint err) {
- switch(err) {
- case ERR_STACK_OVERRUN:
- printf("Error %#x : Stack overrun\n", err);
- break;
- case ERR_ITEM_EXIST:
- printf("Error %#x : Item is already exist\n",err);
- break;
- case ERR_PTR_INVAILD:
- printf("Error %#x : Invaild pointer\n",err);
- break;
- case ERR_LNKLST_INVAILD:
- printf("Error %#x : Invaild Linked-List\n",err);
- break;
- case ERR_ACTCODE_INVAILD:
- printf("Error %#x : Invaild Action Code\n",err);
- break;
- case ERR_ADD_IMPOSSIBLE:
- printf("Error %#x : Item cannot be added\n",err);
- break;
- case ERR_SUB_IMPOSSIBLE:
- printf("Error %#x : Item cannot be subtracted\n",err);
- break;
- case ERR_EMPTY_POLY:
- printf("Error %#x : Polynomial grows empty!\n",err);
- break;
- case ERR_UNKNOWN:
- printf("Error %#x : Unknown error\n",err);
- break;
- }
- }
- #endif
- inline uint
- destory_polynomial(poly_lnklst *plst) {
- poly *p = (poly *)0;
- poly *tmp = (poly *)0;
- #if CHK_PARAMETER_PTR == TRUE
- if(!plst)
- return ERR_LNKLST_INVAILD;
- #endif
- p = plst->head;
- /* 逐一释放链表项目 */
- while(p) {
- tmp = p->next;
- free(p);
- p = tmp;
- }
- /* 释放两表容器 */
- free(plst);
- plst = (poly_lnklst *)0;
- return ERR_ON_SUCCESS;
- }
- inline uint
- init_poly_lnklst(poly_lnklst *plst) {
- #if CHK_PARAMETER_PTR == TRUE
- if(!plst)
- return ERR_LNKLST_INVAILD;
- #endif
- plst->head = (poly *)0;
- plst->tail = (poly *)0;
- plst->length = (int)0;
- return ERR_ON_SUCCESS;
- }
- inline poly *
- create_poly_item(float p, int e, uint *err) {
- poly *item =
- (poly *)malloc(sizeof(poly));
- if(!item) {
- *err = ERR_STACK_OVERRUN;
- return (poly *)0;
- }
- item->p = p;
- item->e = e;
- item->next = (poly *)0;
- item->prev = (poly *)0;
- *err = ERR_ON_SUCCESS;
- return item;
- }
- #if COPY_LNKLST == TRUE
- inline poly_lnklst *
- copy_polynomial(poly_lnklst *plstSrc,uint *err) {
- poly *pSrc = (poly *)0;
- poly *pDes = (poly *)0;
- poly *tmp = (poly *)0;
- poly_lnklst *plstDes = (poly_lnklst *)0;
- #if CHK_PARAMETER_PTR == TRUE
- if(!plstSrc) {
- *err = ERR_LNKLST_INVAILD;
- return (poly_lnklst *)0;
- }
- #endif
- plstDes = (poly_lnklst *)malloc(sizeof(poly_lnklst));
- if(!plstDes) {
- *err = ERR_STACK_OVERRUN;
- #if RAISE_ERR == TRUE
- raise_err(*err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return (poly_lnklst *)0;
- #endif
- }
- /* 复制表首 */
- pSrc = plstSrc->head;
- if(!pSrc) {
- free(plstDes);
- *err = ERR_EMPTY_POLY;
- return (poly_lnklst *)0;
- }
- pDes = create_poly_item(pSrc->p,pSrc->e,err);
- if(*err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(*err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return (poly_lnklst *)0;
- #endif
- }
- plstDes->head = plstDes->tail = pDes;
- plstDes->length = plstSrc->length;
- /* 逐一复制余下的项目 */
- pSrc = pSrc->next;
- while(pSrc) {
- tmp = create_poly_item(pSrc->p,pSrc->e,err);
- if(*err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(*err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return (poly_lnklst *)0;
- #endif
- }
- /* 创建链表的节点连接 */
- pDes->next = tmp;
- tmp->prev = pDes;
- pDes = tmp;
- plstDes->tail = tmp;
- pSrc = pSrc->next;
- }
- return plstDes;
- }
- #endif
- inline uint
- connect_to_lst(poly_lnklst *plst, poly *item) {
- poly *p = (poly *)0,
- *tmp = (poly *)0;
- #if CHK_PARAMETER_PTR == TRUE
- if(!plst)
- return ERR_LNKLST_INVAILD;
- if(!item)
- return ERR_PTR_INVAILD;
- #endif
- if(!plst->head) {
- plst->head = plst->tail = item;
- item->next = item->prev = (poly *)0;
- plst->length = (int)1;
- }
- else {
- p = plst->head;
- while(p) {
- tmp = p->next;
- #if AUTO_DESTORY_EXIST == TRUE
- if(p->e == item->e) {
- free(item);
- item = (poly *)0;
- return ERR_ITEM_EXIST;
- }
- #else
- if(p->e == item->e)
- return ERR_ITEM_EXIST;
- #endif
- if(tmp) {
- if((p->e < item->e) && (tmp->e > item->e)) {
- item->prev = p;
- item->next = tmp;
- p->next = item;
- tmp->prev = item;
- ++plst->length;
- break;
- }
- }
- else {
- if(p->e > item->e && !p->prev) {
- item->prev = (poly *)0;
- item->next = p;
- p->prev = item;
- plst->head = item;
- ++plst->length;
- break;
- }
- else {
- item->prev = p;
- item->next = (poly *)0;
- p->next = item;
- plst->tail = item;
- ++plst->length;
- break;
- }
- }
- p = tmp;
- }
- }
- return ERR_ON_SUCCESS;
- }
- inline uint
- remove_item(poly_lnklst *plst, poly *item) {
- poly *tmp_prev = (poly *)0;
- poly *tmp_next = (poly *)0;
- #if CHK_PARAMETER_PTR == TRUE
- if(!plst)
- return ERR_LNKLST_INVAILD;
- if(!plst->head || !item)
- return ERR_PTR_INVAILD;
- #endif
- tmp_prev = item->prev;
- tmp_next = item->next;
- if(tmp_prev) {
- tmp_prev->next = tmp_next;
- if(tmp_next)
- tmp_next->prev = tmp_prev;
- else
- plst->tail = tmp_prev;
- }
- else {
- plst->head = tmp_next;
- if(!tmp_next)
- return ERR_EMPTY_POLY;
- if(!tmp_next->next)
- plst->tail = tmp_next;
- tmp_next->prev = (poly *)0;
- }
- --plst->length;
- free(item);
- item = (poly *)0;
- return ERR_ON_SUCCESS;
- }
- inline uint
- merge_item(poly *des, poly *src, uint code) {
- poly *tmp = (poly *)0;
- poly *tmp_prev = (poly *)0;
- poly *tmp_next = (poly *)0;
- #if CHK_PARAMETER_PTR == TRUE
- if(!des || !src)
- return ERR_PTR_INVAILD;
- #endif
- switch(code) {
- case ACT_ADD:
- if(des->e == src->e) {
- des->p += src->p;
- return ERR_ON_SUCCESS;
- }
- else
- return ERR_ADD_IMPOSSIBLE;
- case ACT_SUB:
- if(des->e == src->e) {
- des->p -= src->p;
- return ERR_ON_SUCCESS;
- }
- else
- return ERR_SUB_IMPOSSIBLE;
- case ACT_MUP:
- des->p *= src->p;
- des->e += src->e;
- return ERR_ON_SUCCESS;
- default:
- return ERR_ACTCODE_INVAILD;
- }
- }
- inline uint
- find_and_merge(poly_lnklst *plst) {
- poly *tmp = (poly *)0;
- poly *tmp_next = (poly *)0;
- poly *tmp_prev = (poly *)0;
- poly **container = (poly **)0;
- register int i = 0;
- register int j;
- uint err;
- #if CHK_PARAMETER_PTR == TRUE
- if(!plst)
- return ERR_LNKLST_INVAILD;
- if(!plst->head)
- return ERR_PTR_INVAILD;
- #endif
- tmp = plst->head;
- container = (poly **)malloc(sizeof(poly *) * plst->length);
- container[0] = tmp;
- tmp = tmp->next;
- while(tmp) {
- for(j = i; j >=0; --j) {
- if(!container[j])
- continue;
- if(container[j]->e == tmp->e) {
- err = merge_item(tmp,container[j],ACT_ADD);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- err = remove_item(plst,container[j]);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 如果系数为0 */
- if(tmp->p <= EPSILON) {
- tmp_next = tmp->next;
- err = remove_item(plst,tmp);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- tmp = tmp_next;
- }
- else
- tmp = tmp->next;
- break;
- }
- }
- /* 如果没有合并,则存入容器 */
- if(j < 0) {
- container[++i] = tmp;
- tmp = tmp->next;
- }
- }
- free(container);
- return ERR_ON_SUCCESS;
- }
- inline uint
- polynomial_opr(poly_lnklst *plstDes, poly_lnklst *plstSrc, uint oprcode) {
- poly *pSrc = (poly *)0;
- poly *pDes = (poly *)0;
- poly *tmp = (poly *)0;
- poly_lnklst *plstOpr = (poly_lnklst *)0;
- poly_lnklst *plstRet = (poly_lnklst *)0;
- uint err;
- #if CHK_PARAMETER_PTR == TRUE
- if(!plstDes || !plstSrc)
- return ERR_LNKLST_INVAILD;
- if(!plstDes->head || !plstSrc->head)
- return ERR_PTR_INVAILD;
- #endif
- pSrc = plstSrc->head;
- switch(oprcode) {
- case ACT_ADD:
- case ACT_SUB:
- while(pSrc) {
- pDes = plstDes->head;
- while(pDes) {
- if(pSrc->e == pDes->e) {
- err = merge_item(pDes,pSrc,oprcode);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 如果相加后的系数为0,则删除此项 */
- if(pDes->p <= EPSILON) {
- tmp = pDes->next;
- err = remove_item(plstDes,pDes);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- pDes = tmp;
- }
- break;
- }
- else {
- if(pDes->next) {
- if((pSrc->e > pDes->e) && (pSrc->e < pDes->next->e)) {
- tmp = create_poly_item(pSrc->p,pSrc->e,&err);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- tmp->prev = pDes;
- tmp->next = pDes->next;
- pDes->next->prev = tmp;
- pDes->next = tmp;
- ++plstDes->length;
- break;
- }
- }
- else {
- tmp = create_poly_item(pSrc->p,pSrc->e,&err);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- if(pDes->e > tmp->e && !pDes->prev) {
- tmp->prev = (poly *)0;
- tmp->next = pDes;
- pDes->prev = tmp;
- plstDes->head = tmp;
- ++plstDes->length;
- break;
- }
- else {
- plstDes->tail->next = tmp;
- tmp->prev = plstDes->tail;
- tmp->next = (poly *)0;
- plstDes->tail = tmp;
- ++plstDes->length;
- break;
- }
- }
- }
- pDes = pDes->next;
- }
- pSrc = pSrc->next;
- }
- return ERR_ON_SUCCESS;
- case ACT_MUP:
- /* 复制旧链表 */
- plstOpr = copy_polynomial(plstDes,&err);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 首先计算第一项,保存到返回链表 */
- pDes = plstOpr->head;
- while(pDes) {
- err = merge_item(pDes,pSrc,ACT_MUP);
- pDes = pDes->next;
- }
- plstRet = copy_polynomial(plstOpr,&err);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 删除plstOpr */
- err = destory_polynomial(plstOpr);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 计算其余项 */
- pSrc = pSrc->next;
- while(pSrc) {
- plstOpr = copy_polynomial(plstDes,&err);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- pDes = plstOpr->head;
- while(pDes) {
- err = merge_item(pDes,pSrc,ACT_MUP);
- pDes = pDes->next;
- }
- /* 两链表相加 */
- err = polynomial_opr(plstRet,plstOpr,ACT_ADD);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 删除plstOpr */
- err = destory_polynomial(plstOpr);
- if(err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return err;
- #endif
- }
- /* 计算下一项 */
- pSrc = pSrc->next;
- }
- /* 清除原表达式 */
- pDes = plstDes->head;
- while(pDes) {
- pSrc = pDes->next;
- free(pDes);
- pDes = pSrc;
- }
- plstDes->head = plstRet->head;
- plstDes->tail = plstRet->tail;
- plstDes->length = plstRet->length;
- free(plstRet);
- return ERR_ON_SUCCESS;
- default:
- return ERR_ACTCODE_INVAILD;
- }
- }
- #if SIMPLE_OUTPUT == TRUE
- inline void
- print_polynomial(poly_lnklst *plst) {
- poly *p = plst->head;
- printf("P = %c%.1fx^%d",p->p > 0 ? '\0' : '-',p->p,p->e);
- p = p->next;
- while(p) {
- printf("%c%.1fx^%d",p->p > 0 ? '+' : '-',p->p,p->e);
- p = p->next;
- }
- printf("\n");
- }
- #endif
- #if SIMPLE_INPUT == TRUE
- inline poly_lnklst *
- input_polynomial(uint *err) {
- poly *item = (poly *)0;
- poly_lnklst *plst = (poly_lnklst *)malloc(sizeof(poly_lnklst));
- int item_count = 0;
- int i = 0;
- *err = init_poly_lnklst(plst);
- if(*err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(*err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- return (poly_lnklst *)0;
- #endif
- }
- printf("Input how many items do you want to constructure a polynomial? ");
- scanf("%d",&item_count);
- while(item_count > 0) {
- item = (poly *)malloc(sizeof(poly));
- if(!item) {
- *err = ERR_STACK_OVERRUN;
- #if RAISE_ERR == TRUE
- raise_err(*err);
- #endif
- #if CRITICAL_ABORT == TRUE
- exit(1);
- #else
- free(plst);
- return (poly_lnklst *)0;
- #endif
- }
- printf("(p,e) ? ");
- scanf("%f,%d",&item->p,&item->e);
- *err = connect_to_lst(plst,item);
- if(*err != ERR_ON_SUCCESS) {
- #if RAISE_ERR == TRUE
- raise_err(*err);
- #endif
- #if AUTO_DESTORY_EXIST == FALSE
- free(item);
- #endif
- continue;
- }
- --item_count;
- }
- *err = ERR_ON_SUCCESS;
- return plst;
- }
- #endif
- /* main.cpp */
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include "Polynomial.h"
- int main() {
- poly_lnklst *plstA, *plstB;
- uint err;
- /* inputs */
- printf("Input polynomial A\n");
- plstA = input_polynomial(&err);
- printf("Input polynomial B\n");
- plstB = input_polynomial(&err);
- /* mutiply */
- err = polynomial_opr(plstA,plstB,ACT_MUP);
- print_polynomial(plstA);
- getch();
- err = destory_polynomial(plstA);
- err = destory_polynomial(plstB);
- return 0;
- }
迷宫算法(用栈实现)
- /* 工程名称: W32_Maze */
- /* Maze.h */
- #ifndef __MAZE_H
- #define __MAZE_H
- #define TRUE 0x01
- #define FALSE 0x00
- #define DEFAULT_MAZE TRUE
- #define PATH_BLOCK 0x00
- #define PATH_WALK_ON 0x01
- #define PATH_FOOT_PRINT 0x02
- #define MAX_COL 10
- #include "Maze.cpp"
- #endif
- /* Maze.cpp */
- /* 无符号整型 */
- typedef unsigned int uint_t;
- /* 地图数据 */
- typedef int map_t;
- typedef struct track {
- /* 在迷宫矩阵中的位置 */
- uint_t x;
- uint_t y;
- /* 可用方向 */
- uint_t direct;
- struct track *next;
- struct track *prev;
- } maze_track;
- typedef struct {
- /* 路径 */
- maze_track *track_ptr;
- /* 迷宫出口的位置 */
- uint_t endx;
- uint_t endy;
- /* 当前栈的长度 */
- int size;
- } maze_path;
- int count = 0;
- /* 方向查询表 */
- uint_t directInqTbl[4] = {0x01, 0x02, 0x04, 0x08};
- /* 方向使用表 */
- uint_t directUseTbl[4] = {0xE, 0xD, 0xB, 0x7};
- /* 方向算数常数 */
- int directTbl[4][2] = {{0,-1},{0,1},{-1,0},{1,0}};
- /* 墙、路和足迹的符号集 */
- unsigned char symbolic[3] = { '#', 0x20, '*' };
- //unsigned char symbolic[3] = {0x2A, 0x20, '#'};
- #if DEFAULT_MAZE == TRUE
- static map_t def_maze[10][10] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 1, 0, 1, 1, 1, 0, 1, 0,
- 0, 1, 1, 0, 1, 1, 1, 0, 1, 0,
- 0, 1, 1, 1, 1, 0, 0, 0, 1, 0,
- 0, 1, 0, 0, 0, 1, 1, 0, 1, 0,
- 0, 1, 1, 1, 0, 1, 1, 0, 1, 0,
- 0, 1, 0, 1, 1, 1, 0, 1, 1, 0,
- 0, 1, 0, 0, 0, 1, 0, 0, 1, 0,
- 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
- #endif
- inline maze_path *
- create_path(void) {
- maze_path *path = (maze_path *)malloc(sizeof(maze_path));
- assert(path);
- path->track_ptr = (maze_track *)0;
- path->size = (int)0;
- return path;
- }
- inline void
- generate_enterance(maze_path *path,uint_t x, uint_t y) {
- if(path && !path->size) {
- path->track_ptr = (maze_track *)malloc(sizeof(maze_track));
- assert(path->track_ptr);
- path->track_ptr->direct = (uint_t)0;
- path->track_ptr->x = x;
- path->track_ptr->y = y;
- path->track_ptr->next = (maze_track *)0;
- path->track_ptr->prev = (maze_track *)0;
- ++path->size;
- }
- }
- inline void
- designate_exit(maze_path *path, uint_t x, uint_t y) {
- if(path) {
- path->endx = x;
- path->endy = y;
- }
- }
- inline void
- print_maze(map_t maze[][MAX_COL], uint_t row, uint_t col) {
- register uint_t i,j;
- for(i = 0; i < row; ++i) {
- for(j = 0; j < col; ++j)
- printf("%c",*(symbolic + maze[i][j]));
- printf("\n");
- }
- }
- inline uint_t
- find_my_way(map_t maze[][MAX_COL], uint_t row, uint_t col, maze_path *path) {
- register int i,j;
- uint_t x;
- uint_t y;
- uint_t ex;
- uint_t ey;
- maze_track *ptrack = (maze_track *)0;
- maze_track *ptmp = (maze_track *)0;
- if(path) {
- /* 设置入口方向量 */
- assert(path->track_ptr);
- for(i = 0; i < 4; ++i) {
- x = path->track_ptr->x + directTbl[i][0];
- y = path->track_ptr->y + directTbl[i][1];
- if( (x < 0 || x >= col) || (y < 0 || y >= row))
- continue;
- if(maze[y][x] == PATH_WALK_ON)
- path->track_ptr->direct |= directInqTbl[i];
- }
- ptrack = path->track_ptr;
- ex = path->endx;
- ey = path->endy;
- while(ptrack->x != ex || ptrack->y != ey) {
- /* 获取行进方向 */
- for(i = 0; i < 4; ++i) {
- /* 方向有效,则该方向被使用 */
- if( ((ptrack->direct & directInqTbl[i]) >> i) == 0x01 ) {
- ptrack->direct &= directUseTbl[i];
- break;
- }
- }
- /* 当入口方向量用完,则宣告无解 */
- if(i == 4) {
- if(!ptrack->prev) {
- printf("No way to solve!\n");
- return FALSE;
- }
- /* 当最后个路径节点用完方向量,则折回 */
- else {
- /* 清除足迹 */
- maze[ptrack->y][ptrack->x] = PATH_WALK_ON;
- ptmp = ptrack->prev;
- ptmp->next = (maze_track *)0;
- free(ptrack);
- ptrack = ptmp;
- --path->size;
- ++count;
- continue;
- }
- }
- ptmp = (maze_track *)malloc(sizeof(maze_track));
- assert(ptmp);
- ptrack->next = ptmp;
- ++path->size;
- /* 创建链表结构,在旧位置处留下足迹 */
- maze[ptrack->y][ptrack->x] = PATH_FOOT_PRINT;
- /* 设置新位置 */
- ptmp->x = ptrack->x + directTbl[i][0];
- ptmp->y = ptrack->y + directTbl[i][1];
- ptmp->direct = (uint_t)0;
- ptmp->prev = ptrack;
- ptrack = ptmp;
- ptmp->next = (maze_track *)0;
- /* 为下一个路径节点获取方向信号 */
- for(j = 0; j < 4; ++j) {
- x = ptrack->x + directTbl[j][0];
- y = ptrack->y + directTbl[j][1];
- if( (x < 0 || x >= col) || (y < 0 || y >= row))
- continue;
- if(maze[y][x] == PATH_WALK_ON && maze[y][x] != PATH_FOOT_PRINT)
- ptrack->direct |= directInqTbl[j];
- }
- }
- maze[ey][ex] = PATH_FOOT_PRINT;
- return TRUE;
- }
- return FALSE;
- }
- inline void
- destory_path(maze_path *path) {
- assert(path);
- maze_track *track = path->track_ptr;
- maze_track *tmp = (maze_track *)0;
- while(track) {
- tmp = track->next;
- free(track);
- track = tmp;
- }
- free(path);
- path = (maze_path *)0;
- }
- /* main.cpp */
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <assert.h>
- #include "Maze.h"
- int main() {
- uint_t ret;
- /* 创建路径链 */
- maze_path *path = create_path();
- maze_track *p;
- /* 初始化入口 */
- generate_enterance(path,1,1);
- /* 初始化终点 */
- designate_exit(path,8,8);
- printf("Before explorer\n");
- print_maze(def_maze,10,10);
- /* 开始探索 */
- ret = find_my_way(def_maze,10,10,path);
- if(ret == TRUE) {
- p = path->track_ptr;
- printf("(%u,%u)",p->x, p->y);
- p = p->next;
- while(p) {
- printf("->(%u,%u)",p->x, p->y);
- p = p->next;
- }
- printf("\n");
- printf("\nAfter explorer\n");
- print_maze(def_maze,10,10);
- }
- printf("\nReturn count = %d\n",count);
- getch();
- destory_path(path);
- return 0;
- }