数据结构与算法分析 C++
作者&投稿:辟屈 (若有异议请与网页底部的电邮联系)
http://down.51cto.com/data/101180
http://zhidao.baidu.com/share/e59d6ae02d6670c991c39d9cd462f5cc.html
推荐下载百度的
如果你对C++不是非常熟悉的话,学习算法的时候还是看C语言描述的比较直观。再者算法学习方面比较权威的有一本《算法导论》,这本书讲的很有深度,所以认真读起来还是很有意思的。另外需要纠正一点,语言本身就是来实现算法的载体,所以学透一门语言也是必须的。
维斯【美】编的《数据结构与算法分析》(第三版)C++版,这本书我看了,很不错的,讲得很好,算法导论。
维斯【美】编的《数据结构与算法分析》(第三版)C++版这本书,开始讲了一些简单的需要的C++知识,其实这本书用到的C++特性很少,所以即使你对C++的了解不多的话也可以看的。
单纯地做算法建议用C。
你说的是中序线索二叉树的插入和删除
#include <stdio.h>
#include "malloc.h"
#include "windows.h"
#define maxsize 20 //规定树中结点的最大数目
typedef struct node{ //定义数据结构
int ltag,rtag; //表示child域指示该结点是否孩子
char data; //记录结点的数据
struct node *lchild,*rchild; //记录左右孩子的指针
}Bithptr;
Bithptr *Q[maxsize]; //建队,保存已输入的结点的地址
Bithptr *CreatTree(){ //建树函数,返回根指针
char ch;
int front,rear;
Bithptr *T,*s;
T=NULL;
front=1;rear=0; //置空二叉树
printf("建立一棵二叉树,请输入结点信息:
");
printf("请输入新的结点信息,@为空结点,#为结束标志:");
ch=getchar()(); //输入第一个字符
while(ch!='#') //判断是否为结束字符
{
s=NULL;
if(ch!='@') //判断是否为虚结点
{
s=(Bithptr *)malloc(sizeof(Bithptr));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
s->rtag=0;
s->ltag=0;
}
rear++;
Q[rear]=s; //将结点地址加入队列中
if(rear==1)T=s; //输入为第一个结点为根结点
else
{
if(s!=NULL&&Q[front]!=NULL) //孩子和双亲结点均不是虚结点
if(rear%2==0)
Q[front]->lchild=s;
else Q[front]->rchild=s;
if(rear%2==1)front++;
}getchar()();
printf("请输入新的结点信息,@为空结点,#为结束标志:");
ch=getchar()();
}
return T;
}
void Inorder(Bithptr *T) //中序遍历
{
if(T)
{
if(T->ltag!=1)Inorder(T->lchild);
printf("→%c",T->data);
if(T->rtag!=1)Inorder(T->rchild);
}
}
Bithptr *pre=NULL;
void PreThread(Bithptr *root) //中序线索化算法,函数实现
{
Bithptr *p;
p=root;
if(p){
PreThread(p->lchild);//线索化左子树
if(pre&&pre->rtag==1)pre->rchild=p; //前驱结点后继线索化
if(p->lchild==NULL)
{
p->ltag=1;
p->lchild=pre;
}
if(p->rchild==NULL) //后继结点前驱线索化
p->rtag=1;
pre=p;
PreThread(p->rchild);
}
}
void PrintIndex(Bithptr *t) //输出线索
{
Bithptr *f;
f=t;
if(f)
{
if(f->ltag==1&&f->lchild==NULL&&f->rtag==1) printf("【%c】",f->data); //如果是第一个结点
if(f->ltag==1&&f->lchild!=NULL) printf("%c→【%c】",f->lchild->data,f->data); //如果此结点有前驱就输出前驱和此结点
if(f->ltag==1&&f->rtag==1&&f->rchild!=NULL) printf("→%c",f->rchild->data); //如果此结点有前驱也有后继,就输出后继
else if(f->rtag==1&&f->rchild!=NULL) printf("【%c】→%c",f->data,f->rchild->data);//如果没有前驱,就输出此结点和后继
printf("
");
if(f->ltag!=1)PrintIndex(f->lchild);
if(f->rtag!=1)PrintIndex(f->rchild);
}
}
Bithptr *SearchChild(Bithptr *point,char findnode) //查找孩子结点函数
{
Bithptr *point1,*point2;
if(point!=NULL)
{
if(point->data==findnode) return point;
else
if(point->ltag!=1) { point1=SearchChild(point->lchild,findnode); if(point1!=NULL)return point1;}
if(point->rtag!=1) { point2=SearchChild(point->rchild,findnode); if(point2!=NULL)return point2;}
return NULL;
}
else
return NULL;
}
Bithptr *SearchPre(Bithptr *point,Bithptr *child) //查找父亲结点函数
{
Bithptr *point1,*point2;
if(point!=NULL)
{
if((point->ltag!=1&&point->lchild==child)||(point->rtag!=1&&point->rchild==child)) return point;//找到则返回
else
if(point->ltag!=1)
{
point1=SearchPre(point->lchild,child);
if(point1!=NULL)
return point1;
}
if(point->rtag!=1)
{
point2=SearchPre(point->rchild,child);
if(point2!=NULL)
return point2;
}
return NULL;
}
else
return NULL;
}
void Insert(Bithptr *root)
{
char ch;
char c;
Bithptr *p1,*child,*p2;
printf("请输入要插入的结点的信息:");
scanf("%c",&c);
scanf("%c",&c);
p1=(Bithptr *)malloc(sizeof(Bithptr)); //插入的结点信息
p1->data=c;
p1->lchild=NULL;
p1->rchild=NULL;
p1->rtag=0;
p1->ltag=0;
printf("输入查找的结点信息:");
scanf("%c",&ch);
scanf("%c",&ch);
child=SearchChild(root,ch); //查孩子结点的地址
if(child==NULL){
printf("没有找到结点
");
system("pause");
return ;
}
else printf("发现结点%c
",child->data);
if(child->ltag==0) //当孩子结点有左孩子的时候
{
p2=child;
child=child->lchild;
while(child->rchild&&child->rtag==0) //找到左子树下,最右结点
child=child->rchild;
printf("发现结点%c
",child->data);
p1->rchild=child->rchild; //后继化
p1->rtag=1;
child->rtag=0;
child->rchild=p1; //连接
p1->lchild=child; //前驱化
p1->ltag=1;
}
else //当孩子结点没有左孩子的时候
{
p1->lchild=child->lchild; //前驱化
child->ltag=0;
p1->ltag=1;
child->lchild=p1;
p1->rchild=child;
p1->rtag=1;
}
printf("插入结点操作已经完成,并同时完成了线索化的恢复
");
}
中序线索二叉树的插入和删除
说的是中序线索二叉树的插入和删除
#include <<a href="https://www.baidu.com/s?wd=stdio.h&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3PvFhnWFbmHuhny7Wm1IB0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1TdnHTkn1R4P1n1njfdrjf3P0" target="_blank" class="baidu-highlight">stdio.h</a>>
#include "<a href="https://www.baidu.com/s?wd=malloc.h&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3PvFhnWFbmHuhny7Wm1IB0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1TdnHTkn1R4P1n1njfdrjf3P0" target="_blank" class="baidu-highlight">malloc.h</a>"
#include "windows.h"
#define maxsize 20 //规定树中结点的最大数目
typedef struct node{ //定义数据结构
int ltag,rtag; //表示child域指示该结点是否孩子
char data; //记录结点的数据
struct node *lchild,*rchild; //记录左右孩子的指针
}Bithptr;
Bithptr *Q[maxsize]; //建队,保存已输入的结点的地址
Bithptr *CreatTree(){ //建树函数,返回根指针
char ch;
int front,rear;
Bithptr *T,*s;
T=NULL;
front=1;rear=0; //置空二叉树
printf("建立一棵二叉树,请输入结点信息:\n");
printf("请输入新的结点信息,@为空结点,#为结束标志:");
ch=getchar()(); //输入第一个字符
while(ch!='#') //判断是否为结束字符
{
s=NULL;
if(ch!='@') //判断是否为虚结点
{
s=(Bithptr *)malloc(sizeof(Bithptr));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
s->rtag=0;
s->ltag=0;
}
rear++;
Q[rear]=s; //将结点地址加入队列中
if(rear==1)T=s; //输入为第一个结点为根结点
else
{
if(s!=NULL&&Q[front]!=NULL) //孩子和双亲结点均不是虚结点
if(rear%2==0)
Q[front]->lchild=s;
else Q[front]->rchild=s;
if(rear%2==1)front++;
}getchar()();
printf("请输入新的结点信息,@为空结点,#为结束标志:");
ch=getchar()();
}
return T;
}
void Inorder(Bithptr *T) //<a href="https://www.baidu.com/s?wd=%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3PvFhnWFbmHuhny7Wm1IB0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1TdnHTkn1R4P1n1njfdrjf3P0" target="_blank" class="baidu-highlight">中序遍历</a>
{
if(T)
{
if(T->ltag!=1)Inorder(T->lchild);
printf("→%c",T->data);
if(T->rtag!=1)Inorder(T->rchild);
}
}
Bithptr *pre=NULL;
void PreThread(Bithptr *root) //中序线索化算法,函数实现
{
Bithptr *p;
p=root;
if(p){
PreThread(p->lchild);//线索化左子树
if(pre&&pre->rtag==1)pre->rchild=p; //前驱结点后继线索化
if(p->lchild==NULL)
{
p->ltag=1;
p->lchild=pre;
}
if(p->rchild==NULL) //后继结点前驱线索化
p->rtag=1;
pre=p;
PreThread(p->rchild);
}
}
void PrintIndex(Bithptr *t) //输出线索
{
Bithptr *f;
f=t;
if(f)
{
if(f->ltag==1&&f->lchild==NULL&&f->rtag==1) printf("【%c】",f->data); //如果是第一个结点
if(f->ltag==1&&f->lchild!=NULL) printf("%c→【%c】",f->lchild->data,f->data); //如果此结点有前驱就输出前驱和此结点
if(f->ltag==1&&f->rtag==1&&f->rchild!=NULL) printf("→%c",f->rchild->data); //如果此结点有前驱也有后继,就输出后继
else if(f->rtag==1&&f->rchild!=NULL) printf("【%c】→%c",f->data,f->rchild->data);//如果没有前驱,就输出此结点和后继
printf("\n");
if(f->ltag!=1)PrintIndex(f->lchild);
if(f->rtag!=1)PrintIndex(f->rchild);
}
}
Bithptr *SearchChild(Bithptr *point,char findnode) //查找孩子结点函数
{
Bithptr *point1,*point2;
if(point!=NULL)
{
if(point->data==findnode) return point;
else
if(point->ltag!=1) { point1=SearchChild(point->lchild,findnode); if(point1!=NULL)return point1;}
if(point->rtag!=1) { point2=SearchChild(point->rchild,findnode); if(point2!=NULL)return point2;}
return NULL;
}
else
return NULL;
}
Bithptr *SearchPre(Bithptr *point,Bithptr *child) //查找父亲结点函数
{
Bithptr *point1,*point2;
if(point!=NULL)
{
if((point->ltag!=1&&point->lchild==child)||(point->rtag!=1&&point->rchild==child)) return point;//找到则返回
else
if(point->ltag!=1)
{
point1=SearchPre(point->lchild,child);
if(point1!=NULL)
return point1;
}
if(point->rtag!=1)
{
point2=SearchPre(point->rchild,child);
if(point2!=NULL)
return point2;
}
return NULL;
}
else
return NULL;
}
void Insert(Bithptr *root)
{
char ch;
char c;
Bithptr *p1,*child,*p2;
printf("请输入要插入的结点的信息:");
scanf("%c",&c);
scanf("%c",&c);
p1=(Bithptr *)malloc(sizeof(Bithptr)); //插入的结点信息
p1->data=c;
p1->lchild=NULL;
p1->rchild=NULL;
p1->rtag=0;
p1->ltag=0;
printf("输入查找的结点信息:");
scanf("%c",&ch);
scanf("%c",&ch);
child=SearchChild(root,ch); //查孩子结点的地址
if(child==NULL){
printf("没有找到结点\n");
system("pause");
return ;
}
else printf("发现结点%c\n",child->data);
if(child->ltag==0) //当孩子结点有左孩子的时候
{
p2=child;
child=child->lchild;
while(child->rchild&&child->rtag==0) //找到左子树下,最右结点
child=child->rchild;
printf("发现结点%c\n",child->data);
p1->rchild=child->rchild; //后继化
p1->rtag=1;
child->rtag=0;
child->rchild=p1; //连接
p1->lchild=child; //前驱化
p1->ltag=1;
}
else //当孩子结点没有左孩子的时候
{
p1->lchild=child->lchild; //前驱化
child->ltag=0;
p1->ltag=1;
child->lchild=p1;
p1->rchild=child;
p1->rtag=1;
}
printf("\t插入结点操作已经完成,并同时完成了线索化的恢复\n");
}
莘单艾和: 如果你对C++不是非常熟悉的话,学习算法的时候还是看C语言描述的比较直观.再者算法学习方面比较权威的有一本《算法导论》,这本书讲的很有深度,所以认真读起来还是很有意思的.另外需要纠正一点,语言本身就是来实现算法的载体,所以学透一门语言也是必须的.维斯【美】编的《数据结构与算法分析》(第三版)C++版,这本书我看了,很不错的,讲得很好,算法导论.维斯【美】编的《数据结构与算法分析》(第三版)C++版这本书,开始讲了一些简单的需要的C++知识,其实这本书用到的C++特性很少,所以即使你对C++的了解不多的话也可以看的.单纯地做算法建议用C.
南县15094439025: C++数据结构与算法什么时候看最好 - ?
莘单艾和: 可以把C++看成“表达方式”,而把算法和数据结构看成“想法”.所以说应该在有一定的语言基础时学习算法和数据结构.C++和数据库是两种不同的概念.建议应该先看C++,知道该怎么应用以后再去看数据库,将数据库运用到其中,功能就很强大了.学习算法的时候还是看C语言描述的比较直观.再者算法学习方面比较权威的有一本《算法导论》,这本书讲的很有深度,所以认真读起来还是很有意思的.另外需要纠正一点,语言本身就是来实现算法的载体,所以学透一门语言也是必须的.
南县15094439025: 《数据结构域与算法分析》C和C++那个更好??
莘单艾和: 我用的就是《数据结构与算法分析》(C++语言描述第二版),Larry Nyhoff著.书面有三颗骰子的那本,觉得挺不错.而且参加ACM用C++比较好,因为它有STL可以直接调用,书中也讲了许多的STL的实现.最后,它是中文版的
南县15094439025: 数据结构与算法分析 c++怎么样 - ?
莘单艾和: 您好!!c语言的基本语法你只要掌握了,,数据结构都不是问题数据结构就是 数据的组织方式 或者说 是一种更便捷的让程序更高效的方法.这里面用到的都是c语言的基础知识.就像你做饭 一个辣椒可以炒素菜、可以炒荤菜、也可以炸成辣椒油……同样一个东西 根据自己目的的不同 选择一个最高效的方法 就是数据结构与算法的目的.书上的数据结构与算法 只是给你一些实际应用中的列子和一些基本方法,现实中做程序还需要你自己根据自己的需要去组合去研究更好的算法……很高兴为您解答,不懂的来问我,.谢谢!!
南县15094439025: c++数据结构与算法可做的项目有啥 - ?
莘单艾和: 可以做的项目还是挺多的,但是当下的情况是,C++更多做的是底层的工作,而Java、C#等等语言更多的运用在app、网站的项目中.
南县15094439025: 数据结构资料?
莘单艾和: 1. 数据结构与算法分析C++描述(第三版); 作者: (美)维斯 著,张怀勇 等译;出 版 社: 人民邮电出版社 2. 推荐理由:(1)Mark Allerl Weiss教授撰写的数据结构与算法分析方面的著作曾被评为20世纪最佳的30部计算机著作之一,已经...
南县15094439025: 如何学习C++、数据结构、算法 - ?
莘单艾和: c++要比c语言难的多,每个人学习新的东西时都会感觉到乱的,等你感觉不到乱的时候,可以说你已经入门了或者说已经掌握了,一下接触许多陌生的名词就会感觉乱的,一定的沉得住气努力的学下去,有许多人在中途放弃c++就是辅助课程就把人给搞烦了,高数里要用到傅里叶级数,微分积分等,你两本高等数学都的学,c语言的知识就不多了,了解就行了,数据结构和算法你可以看看清华大学编的数据结构(c语言版的),这本书上数据结构和算法都有.高等数学和c语言你一起看,看完了你在学c语言和数据结构和算法,最后学c++,c语言里的函数一定要学会,数据结构和算法都要用到这些.虽然不好学,努力坚持学习下去,你一定会成功.
南县15094439025: C、C++、数据结构、算法 - ?
莘单艾和: 我建议还是学数据结构和算法 数据结构和算法只是一种思维方法 是任何语言都必须的 C和C++只是个工具 就好比你买了辆客车用来代步 你接下来是该学开车呢还是再去买一辆轿车呢?你不会开车买再多车也没用 而数据结构算法什么的就是开车的方法 任何程序到后来都归咎到了数据结构和算法
南县15094439025: 麻烦各位给我推荐一本讲数据结构和算法的好书 - ?
莘单艾和: 《数据结构与算法:C++》 作者: 窦延平 出版日期: 2005年05月第1版 主题词: 数据结构 算法分析 C语言-程序设计 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>程序设计>数据...
南县15094439025: 数据结构与算法分析 有两个版本,一个是C版本,另一个是C++描述版.他们有什么区别呢? - ?
莘单艾和: c++版本的就是偏向类的思想、模版的思想.c版本的就是最基础的c语言将算法实现.如果您学的是c++、并且对模版比较熟悉,建议看c++版本的.如果您写的程序中没有用到类的思想,那么就看c版本的. 我这里有c++版本的电子书,需要可以发给你.