*****大学
***(**学院
数据结构与算法课程设计
题 目:哈夫曼码的编/译码系统;
递归替换问题;跳马问题;
长整数运算问题 专业班级: *******
姓 名: *** 学 号: *** 指导教师: %%%% 成 绩:_____________
目 录
摘 要 ...................................................................................................................... 4 一.哈夫曼码的编/译码系统 ................................................................................. 5 1.采用类语言定义相关的数据类型 ................................................................... 5 2.算法设计 ........................................................................................................... 5 3.函数的调用关系图 ........................................................................................... 8 4.调试分析 ........................................................................................................... 8 5.测试结果 ........................................................................................................... 9 6.源程序(带注释) ......................................................................................... 10 二.递归替换问题 ................................................................................................ 12 1.采用类语言定义相关的数据类型 ................................................................. 12 2.算法设计 ......................................................................................................... 13 3.函数的调用关系图 ......................................................................................... 14 4.调试分析 ......................................................................................................... 14 5.测试结果 ......................................................................................................... 15 6.源程序(带注释) ......................................................................................... 15 三.跳马问题 ........................................................................................................ 16 1.采用类语言定义相关的数据类型 ................................................................. 17 2.算法设计 ......................................................................................................... 18 3.函数的调用关系图 ...................................................................................... 18 4.调试分析 ......................................................................................................... 18 5.测试结果 ......................................................................................................... 19 6.源程序(带注释) ......................................................................................... 19 四.长整数运算问题 ............................................................................................ 22 1.采用类语言定义相关的数据类型 ................................................................. 22 2.算法设计 ......................................................................................................... 24 3.函数的调用关系图 ...................................................................................... 26
4.调试分析 ......................................................................................................... 26 5.测试结果 ......................................................................................................... 27 6.源程序(带注释) ......................................................................................... 28
总 结 .................................................................................................................... 37 参考文献 ................................................................................................................ 37 致 谢 .................................................................................................................... 37
摘 要
本程序主要解决的是哈夫曼码的编/译码系统,跳马问题,递归替换问题和长整数运算问题。采用哈夫曼算法的设计思想。根据给定的权值构成二叉树森林,在森林中任意选取两棵根结点权值最小的树,将这两棵树合并为新的树,为保证新树仍为二叉树,需要增加一个新的结点作为根将这两个孩子的权值之和作为新树根的权值。跳马问题是在个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。递归替换问题,编写程序,扩展C/C++源文件中的#include指令(以递归的方式)。请以文件名的内容替换形如下面的代码行。#include “filename”长整数的四则运算实现两个任意长的整数的加、减、乘运算,由于要实现任意长整数,就需要运用到相应的双向线性链表,以实现整数的任意长的加、减、乘运算。长整数运算实现计算任意长的整数的加、减、乘运算,先输入长整数的最多位数,然后输入要运算的长整数,进行加减运算并显示出这两个数的运算。利用双向循环链表实现长整数的存储,每个结点含一个整形变量。程序使用Visual C++ 6.0工具开发
关键词:哈夫曼码的编/译码系统,排序、递归算法、数组数据结构、链式数据
结构、整数运算。
4
一、哈夫曼码的编/译码系统
编写一个哈夫曼码的编/译码系统,实现对输入的文本信息自动统计并依此为依据建立一个哈夫曼码的编/译码系统。
1、数据结构设计
数据结构可用结构体,节点结构体包括字符的名称、字符权值、左右孩子标
志、对应字符的前缀码、左孩子指针、右孩子指针、双亲指针。题目要求全程信息用文件保存,应写入文件中,提供文件的输入输出等操作;在过程中需有字符及权值录入、字符前缀码生成、文段编码、文段译码,故应分别建立功能模块;另外还应提供键盘式选择菜单实现程序运行。
2、算法设计
利用树的思想创建最优二叉树然后得到对应字符的前缀码
Bnode *
creat_Btree(int k,Bnode z[MAX],int n,Bnode *head[20]) {
Bnode *a,*b,*c; int i=0,j;
a=b=c=(Bnode *)malloc(sizeof(Bnode));
k--; //k相当于循环控制变量,这里-1是循环的需要
while(k>1) {
a=search_min(z,n,k);
a->flag='3'; //修改标志,说明该节点已被选择
b=search_min(z,n,k);
c->weight=a->weight+b->weight;
5
a->parent=c; //指针移动,节点关系确立 b->parent=c; c->lchild=a; c->rchild=b; a->flag='0'; b->flag='1'; c->flag='2';
n++; //z z[n]=*c;
k--; //孩子节点,c成为新的根节点)
} if(k==1) {
for(i=0;i<=n;i++) if(z[i].flag=='2') return (&z[i]); } }
中元素个数加一 根节点个数增减一个(a,b变成6
3、调试分析
1 前缀码
图3.1
2 HAFFMAN编码
图3.2
4、执行结果
图3.3
7
5、源程序(带注释)
# include typedef struct { int weight; //节点的权值 char name; //节点的字符 char flag; //标志,左孩子0,右孩子1,根2 char encod[MAX]; //编码存储数组 struct Bnode *lchild; //左孩子 struct Bnode *rchild; //右孩子 struct Bnode *parent; //双亲 }Bnode; Bnode * creat_Btree(int k,Bnode z[MAX],int n,Bnode *head[20]) { Bnode *a,*b,*c; int i=0,j; a=b=c=(Bnode *)malloc(sizeof(Bnode)); k--; //k相当于循环控制变量,这里-1是循环的需要 while(k>1) { a=search_min(z,n,k); a->flag='3'; //修改标志,说明该节点已被选择 b=search_min(z,n,k); c->weight=a->weight+b->weight; a->parent=c; //指针移动,节点关系确立 b->parent=c; c->lchild=a; c->rchild=b; a->flag='0'; b->flag='1'; c->flag='2'; n++; //z中元素个数加一 z[n]=*c; k--; //根节点个数增减一个(a,b变成孩子节点,c成为新的根节点) 8 } if(k==1) { for(i=0;i<=n;i++) if(z[i].flag=='2') return (&z[i]); } } 9 二.递归替换问题 编写程序,扩展C/C++源文件中的#include指令(以递归的方式)。请以文件名的内容替换形如下面的代码行。 #include “filename” 1.采用类语言定义相关的数据类型 typedef struct //创建结构体,让文件的读写方便 { char data[MAX]; //数据项 }char1; int print(char ch[MAX],int n) //递归函数 2.算法设计 { FILE *fp,*fp1; char s[MAX]; //s,存储#后面的include char1 b[MAX]; //b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; //switch参数,用于确认调用函数的参数 if((fp=fopen(ch,\"rb+\"))==NULL) { printf(\"文件打开失败!\\n\"); exit(0); } while(!feof(fp)) { fread(&b[i],1,sizeof(char1),fp); i++; if(b[i-1].data[0]=='}') //结构体数组计数器 break; } k=i-1; //记录b大小,可以认为是对应文件的行数 fclose(fp); 10 2.算法设计 { FILE *fp,*fp1; char s[MAX]; //s,存储#后面的include char1 b[MAX]; //b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; //switch参数,用于确认调用函数的参数 if((fp=fopen(ch,\"rb+\"))==NULL) { printf(\"文件打开失败!\\n\"); exit(0); } while(!feof(fp)) { fread(&b[i],1,sizeof(char1),fp); i++; if(b[i-1].data[0]=='}') 体数组计数器 break; } k=i-1; 以认为是对应文件的行数 fclose(fp); //结构 //记录b大小,可11 3.函数的调用关系图 创建三个文件用来存储预编译命令 创建要编译的文件 保存结果,输出结果 通过递归算法实现文件预编译 4.调试分析 不调用库函数,实现strcpy函数,要返回char*。 12 5.测试结果 图1.调用测试函数 6.源程序(带注释) # include typedef struct //创建结构体,让文件的读写方便 { char data[MAX]; //数据项 }char1; int print(char ch[MAX],int n) //递归函数 { FILE *fp,*fp1; char s[MAX]; //s,存储#后面的include char1 b[MAX]; //b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; //switch参数,用于确认调用函数的参数 if((fp=fopen(ch,\"rb+\"))==NULL) { printf(\"文件打开失败!\\n\"); exit(0); 13 } while(!feof(fp)) { fread(&b[i],1,sizeof(char1),fp); i++; if(b[i-1].data[0]=='}') //结构体数组计数器 break; } k=i-1; //记录b大小,可以认为是对应文件的行数 fclose(fp); if((fp1=fopen(\"辅助.c\ { printf(\"文件打开失败!\\n\"); exit(0); } d=0; //s数组存取计数器 for(i=0;i for(j=2;j<9;j++) { s[d]=b[i].data[j]; d++; } if((strcmp(s,\"include\"))==0) { flag=b[i].data[19]-'0'; switch(flag) //带选择的递归调用 { case 1:fp=print(\"filename1.c\ case 2:fp=print(\"filename2.c\ case 3:fp=print(\"filename3.c\ default:break; } } else //否则的话讲代码存入辅助文件 { printf(\"%s\\n\ 14 fwrite(&b[i],1,sizeof(char1),fp); fputc('\\r', fp); fputc('\\n', fp); } } else //否则的话讲代码存入辅助文件 { printf(\"%s\\n\ fwrite(&b[i],1,sizeof(char1),fp1); fputc('\\r', fp); fputc('\\n', fp); } } close(fp1); return 0; } 15 三.跳马问题 要求在个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。 1.数据结构设计 国际象棋中马采用“日”字走法,对棋盘上任意一个马所在 的结点,它所能走的结点在一步之内有八种情况,即假设马所在的坐标为(i,j),那么它能走的八个坐标分别为(i+1,j+2),(i+1,j-2),(i+2,j-1),(i+2,j+1),(i-2,j-1),(i-2,j+1),(i-1,j-2),(i-1,j+2),把这八个点个看做是(i,j)的领接点,以此类推每个结点都有邻结点,所以可采用图的深度遍历,以马所在的结点(i,j)为初始结点,对全图进行深度遍历,然后按照遍历的顺序输出结点 2.算法设计 #define MAXNUM 8 //横纵格数最大值 #define INVALIDDIR - 1 //无路可走的情况 #define MAXLEN //棋盘总格数 #define MAXDIR 8 //下一步可走的方向 typedef struct 16 { int x; //表示横坐标 int y; //表示纵坐标 int direction; //表示移动方向 }HorsePoint; HorsePoint ChessPath[MAXLEN]; //模拟路径栈 int count; //入栈结点个数 int ChessBoard[MAXNUM][MAXNUM]; //标志棋盘数组 int x; //表示横坐 int y; //表示纵坐标 int direction; //表示移动方向 }HorsePoint; HorsePoint ChessPath[MAXLEN]; //模拟路径栈 int count; //入栈结点个数 int ChessBoard[MAXNUM][MAXNUM]; //标志棋盘数组 3.调试分析 1输入起始点的位置,如果可以遍历全部位置,则输出8*8的矩阵图。 2输入的起始点的位置不可以遍历全部位置时,则输出错误。 4.测试结果 起始点位置:2,4 图1. 遍历全部位置 17 5.源程序(带注释) #include int x; int y; int direction; } HorsePoint; HorsePoint ChessPath[MAXLEN]; int count; int ChessBoard[MAXNUM][MAXNUM]; void Initial() { int i,j; for(i=0; i ChessPath[i].direction=INVALIDDIR; } count=0; } void PushStack(HorsePoint positon) { ChessBoard[positon.x][positon.y]=1; //把标志设为1,证明已走过 ChessPath[count]=positon; count++; } HorsePoint PopStack() { HorsePoint positon; count--; positon=ChessPath[count]; ChessBoard[positon.x][positon.y]=0; 18 ChessPath[count].direction=INVALIDDIR; return positon; } HorsePoint GetInitPoint() { HorsePoint positon; do { printf(\"\\n请输入起始点(x,y):\"); scanf(\"%d,%d\ //输入horse的起始坐标 //出栈函数 //入栈函数 printf(\"\\n\\n\"); }while(positon.x>=MAXNUM||positon.y>=MAXNUM||positon.x<0||positon.y<0); //不超过各个边缘 positon.direction=INVALIDDIR; return positon; } HorsePoint GetNewPoint(HorsePoint *parent) { int i; HorsePoint newpoint; int tryx[MAXDIR]={1,2,2,1,-1,-2,-2,-1}; int tryy[MAXDIR]={-2,-1,1,2,2,1,-1,-2}; newpoint.direction=INVALIDDIR; parent->direction=parent->direction++; for(i=parent->direction;i if(newpoint.x parent->direction=i; //上一结点可走的方向 //标记已走过 ChessBoard[newpoint.x][newpoint.y]=1; return newpoint; } } parent->direction=INVALIDDIR; return newpoint; } void CalcPoint(HorsePoint hh ) { 19 HorsePoint npositon; HorsePoint *ppositon; Initial(); ppositon=&hh; PushStack(*ppositon); while(!(count==0||count==MAXLEN)) { ppositon=&ChessPath[count-1]; npositon=GetNewPoint(ppositon); if(ppositon->direction!=INVALIDDIR) { ChessPath[count-1].direction=ppositon->direction; PushStack(npositon); } else PopStack(); } } void PrintChess() { int i,j; int state[MAXNUM][MAXNUM]; int step=0; HorsePoint positon; count=MAXLEN; if(count==MAXLEN) { //当棋盘全部走过时 //行走初始化 state[i][j]为棋盘上(i,j)点被踏过 //以8*8矩阵的形式输出运行结果 for(i=0;i HorsePoint h; h=GetInitPoint(); CalcPoint(h); PrintChess(); return 0; //按顺序输出马踏过} 20 四.长整数运算问题 长整数运算问题。设计程序,实现两个任意长的整数的加、减、乘运算问题。 1.数据结构设计 #define NULL 0 #include typedef struct longnode{ /*每个节点的结构*/ int num; /*数字*/ /*指向低一位节点*/ struct longnode *low1; struct longnode *high1; /*指向高一位节点*/ }longnode; typedef struct xlong{ longnode *High; }*xlong; longnode *Low; int digit4; /*每个长整数的结构*/ /*每个长整数的最高节点*/ /*每个长整数的最低节点*/ /*每个长整数的总位数(不包括高位的0)/4 */ 21 程序调用关系: Main()add()subtract()Cheng() Tuichu() 2.算法设计 int add()/*加*/ { char *a1,*b1; int digit4,cf=0; xlong a,b,c; do { printf(\"输入长整数的位数:\");/* 输入要计算的长整数的最多位 数*/ scanf(\"%d\ }while(digit4<=0); 22 a1=(char*)malloc(digit4+1); b1=(char*)malloc(digit4+1); digit4=digit4/4+1; init(&a,digit4); init(&b,digit4); init(&c,digit4); /* 初始化a,b,c */ do { cf=0; printf(\"输入要运算的两个长整数,按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开:\\n\"); scanf(\"%s\ scanf(\"%s\ cf|=ston(b1,b); }while(cf);/* 输入被加数和加数,如果转换出错,则重输 */ pass(a,b,c); /* 进行相加运算 */ printlong(a);printf(\"+\");/* 打印结果 */ printlong(b);printf(\"=\"); printlong(c);printf(\"\\n\"); printf(\"\\n\"); } int subtract()/*减*/ { char *a1,*b1; 23 int digit4,cf=0; xlong a,b,c; do { printf(\"输入长整数的位数:\");/* 输入最多位数*/ scanf(\"%d\ }while(digit4<=0); a1=(char*)malloc(digit4+1); b1=(char*)malloc(digit4+1); digit4=digit4/4+1; init(&a,digit4); init(&b,digit4); init(&c,digit4); /* 初始化a,b,c */ do { cf=0;printf(\"输入要运算的两个长整数:\\n\"); scanf(\"%s\ printf(\"-\\n\"); scanf(\"%s\ cf|=ston(a1,a); cf|=ston(b1,b); }while(cf); /* 输入被减数和减数,如果转换出错,则重输 */ /* 执行相减运算 */ passa(a,b,c); printlong(a);printf(\"-\"); /* 打印结果 */ 24 printlong(b);printf(\"=\"); printlong(c);printf(\"\\n\"); printf(\"\\n\"); } 3.调试分析 调试时遇到的问题: :\\yuanchengxu\\chang.c(30) : error C2143: syntax error : missing ';' before 'else' J:\\yuanchengxu\\chang.c(109) : warning C4013: 'strlen' undefined; assuming extern returning int J:\\yuanchengxu\\chang.c(207) : warning C4133: 'function' : incompatible types - from 'int *' to 'const char *' 执行 cl.exe 时出错. chang.obj - 1 error(s), 0 warning(s) 在else前面忘记加上; 解决方法:在else前加上; 时间复杂度:O(N) 空间复杂度:O(2N) 25 4.测试结果 图4。输入八位数进行运算的结果 5.源程序(带注释) #define NULL 0 #include typedef struct longnode{ /*每个节点的结构*/ int num; /*数字*/ /*指向低一位节点*/ struct longnode *low1; struct longnode *high1; /*指向高一位节点*/ }longnode; typedef struct xlong{ longnode *High; longnode *Low; /*每个长整数的结构*/ /*每个长整数的最高节点*/ /*每个长整数的最低节点*/ 26 int digit4; /*每个长整数的总位数(不包括高位的0)/4 */ }*xlong; int init(xlong *a,int digit4){ /*初始化*/ int i; longnode *j; (*a)=(xlong)malloc(sizeof(struct xlong));/*为a的头结构申请空间,并赋初始值 */ (*a)->High=NULL; (*a)->Low=NULL; (*a)->High=NULL; (*a)->Low=NULL; (*a)->digit4=0; for(i=0;i j->high1=NULL; j->low1=(*a)->High; if((*a)->High) (*a)->High->high1=j; else (*a)->Low=j; (*a)->High=j; (*a)->digit4++; 27 } } int pass(xlong a,xlong b,xlong c){ int cf=0; /* 两个数字的相加 */ longnode *a1=a->Low,*b1=b->Low,*c1=c->Low; while(a1) { c1->num=a1->num+b1->num+cf; if(c1->num>9999){ cf=1; /* 如果产生进位(借位) */ c1->num-=10000; } else{cf=0;} a1=a1->high1;b1=b1->high1;c1=c1->high1; } /* 最高位的进位(借位) */ return cf; } int passa(xlong a,xlong b,xlong c){ int cf=0; /* 两个数字的相减 */ longnode *a1=a->Low,*b1=b->Low,*c1=c->Low; 28 while(a1) { c1->num=a1->num-b1->num-cf; if(c1->num>9999)/* 如果产生进位(借位) */ { cf=1; c1->num-=10000; } else{cf=0;} a1=a1->high1;b1=b1->high1;c1=c1->high1; } /* 最高位的进位(借位) */ return cf; } nep(xlong a){ int cf=1; /* 求a的相反数 */ /* 因为求相反数是取反加一,所以这里cf=1; */ longnode *a1=a->Low; while(a1) { a1->num=9999-(a1->num)+cf; if(a1->num>9999) { a1->num=10000;} 29 else{cf=0;} } a1=a1->high1; return cf; } printlong(xlong a){ longnode *i=a->High;/* 打印长整数a */ if(i->num>=5000) { printf(\"-\"); /* 最高位(bit)=1表示负数,即用补码表示 */ /* 求反打印其绝对值 */ nep(a); } while(i&&i->num==0) i=i->low1; /* 跳过最位的0 */ if(i) { printf(\"%d\i=i->low1; if(i) printf(\ } else printf(\"0\"); /* a=0 打0 */ while(i) 30 } { printf(\"%04d\ if(i->low1) printf(\ i=i->low1; } int ston(char in[],xlong out){ int bit,i,jishu=1,num0=0; /* 把字符串转化为数字赋给a */ longnode *j=out->Low; i=strlen(in)-1; while(i>=0 && j) { /* 循环每一个字节 */ bit=in[i]-'0';/* 把字符形式的值赋给整数形式的bit */ if(bit>=0 && bit <=9) { num0+=jishu*bit; /* 加进num0 */ } jishu*=10; /* 基数自乘10 */ if(jishu>1&&(jishu>=10000||bit<0||bit>9)) /* 数字以外的字符 */ { j->num=num0; j=j->high1; /* 存入一个节点 */ num0=0; 31 jishu=1; } i--; } if(num0) {j->num=num0;j=j->high1;}/* 把最后一个没存入节点的数存入节 点 */ for(;j;j=j->high1) j->num=0; if(out->High->num>=5000) return 1; /* 如果最高位是1,返回1表示出*/ if(in[0]=='-') nep(out); /* 如果最后一个字符是'-'则取反 */ } int add()/*加*/ { char *a1,*b1; int digit4,cf=0; xlong a,b,c; do { printf(\"输入长整数的位数:\");/* 输入要计算的长整数的最多位return 0; /* 最位不足补0 */ 数*/ scanf(\"%d\ }while(digit4<=0); 32 a1=(char*)malloc(digit4+1); b1=(char*)malloc(digit4+1); digit4=digit4/4+1; init(&a,digit4); init(&b,digit4); init(&c,digit4); /* 初始化a,b,c */ do { cf=0; printf(\"输入要运算的两个长整数,按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开:\\n\"); scanf(\"%s\ scanf(\"%s\ cf|=ston(b1,b); }while(cf);/* 输入被加数和加数,如果转换出错,则重输 */ pass(a,b,c); /* 进行相加运算 */ printlong(a);printf(\"+\");/* 打印结果 */ printlong(b);printf(\"=\"); printlong(c);printf(\"\\n\"); printf(\"\\n\"); } int subtract()/*减*/ { char *a1,*b1; 33 int digit4,cf=0; xlong a,b,c; do { printf(\"输入长整数的位数:\");/* 输入最多位数*/ scanf(\"%d\ }while(digit4<=0); a1=(char*)malloc(digit4+1); b1=(char*)malloc(digit4+1); digit4=digit4/4+1; init(&a,digit4); init(&b,digit4); init(&c,digit4); /* 初始化a,b,c */ do { cf=0;printf(\"输入要运算的两个长整数:\\n\"); scanf(\"%s\ printf(\"-\\n\"); scanf(\"%s\ cf|=ston(a1,a); cf|=ston(b1,b); }while(cf); /* 输入被减数和减数,如果转换出错,则重输 */ /* 执行相减运算 */ passa(a,b,c); printlong(a);printf(\"-\"); /* 打印结果 */ 34 printlong(b);printf(\"=\"); printlong(c);printf(\"\\n\"); printf(\"\\n\"); } 35 总 结 通过对C语言、算法与数据结构的学习,尤其是经过这几次的课程设计,我学到了很多东西,可能有一些学的不够理想,但这些知识为我的下一步学习打下了坚实的基础。在整个设计过程中,自己从刚开始简单的构思算法思路的大致框架,直到最后使得整个算法顺利的得以实现。期间遇到的问题、错误多不甚数,然经过无数次的调试分析,最终一一得以解决。 从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是自己却能够在这短短的两个星期里学到很多很多的的东西,不仅可以巩固了以前所学过的知识,加深了对课本知识点的理解。而且学到了很多在书本上所没有学到过的知识,能够说是收获颇丰。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从实践中验证理论,从而提高自己的实际动手能力和思考的能力。当然,在设计的过程中遇到许许多多的问题,可以说得是困难重重,毕竟这是一次课程设计,需要掌握的知识面比较广,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。在设计中,vc使用的也更加的牢固,了解的也更加深刻。 这次课程设计已经结束了,对于我自己,对本次课程设计我的感受很深,在这个过程中,我也曾经因为实践经验的缺乏失落过,也为毫无头绪而烦恼,也曾经为成功的实现而手舞足蹈。让自己在本次课程设计中感受了一番大起大落,使自己从中明白了,做成功一件事,是需要付出和汗水的。天下无难事只怕有心人,只要自己坚定信念,成功也只在咫尺之间。 总之,这次课程设计收获颇多,使各方面的能力得到了提升,积累了丰富的经验。 36 参考文献 [1]梁路宏,艾海舟,何克忠.基于多模板匹配的单人脸检测[J].中国图象图形学报,1999,4A(10):823-830. [2] 胡珊珊.基于遗传算法的人脸检测研究[M].青岛:青岛大学出版社,2006) [3]等编著.《算法与数据结构(C语言版)》.北京:机械工业出版社,2004 [4]许卓群等.《数据结构与算法》.北京:高等教育出版社,2005 [5]徐孝凯编著.《数据结构实用教程(第二版)》.北京:清华大学出版社,2006 [6]徐孝凯.《数据结构辅导与提高实用教程(第二版)》.北京:清华大学出版社,2003 [7]谢楚屏等.《数据结构》.北京:人民邮电出版社,2001 [8]张乃孝等.《算法与数据结构-C语言描述》.北京:高等教育出版社,2002 [9]殷人昆.《数据结构》.北京:清华大学出版社,2001 致 谢 这次课程设计,首先要感谢学校给了我们相当好的上机环境,机房的设备很好,学习环境也很好,一点没有吵闹,也要感谢老师,在这周的教导,每天陪着我们,解答我们的疑难,也监督我们的学习。当然,同学们的帮助也是很重要的,我们互相讨论,虽然课题并不一样,可是解决方法却大同小异,各方面知识都要运用到,合作就显得至关重要。 总之,完成这次课程设计,要搞些的太多,以后一定要更好的学习数据结构,灵活地运用。 37 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务