程序名称:Search.cpp
// 程序功能:采用结构化方法设计程序,实现多种查找算法。
// 程序作者:***
// 最后修改日期:2011-3-3
#include"iostream"
#include"stdlib.h"
#include"stdio.h"
#include "malloc.h"
#define MAX 11
using namespace std;
typedef int ElemType ;
//顺序存储结构
typedef struct {
ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,号单元留空
int length; //表的长度
} SSTable;
void Create(SSTable *table, int length);
void Destroy(SSTable *table);
int Search_Seq(SSTable *table, ElemType key);
void Traverse(SSTable *table, void (*visit)(ElemType elem));
// 构建顺序表
void Create(SSTable **table, int length)
{
SSTable *t = (SSTable*) malloc(sizeof(SSTable));//分配空间
t->elem=(ElemType*)malloc(sizeof(ElemType)*(length+1));
t->length=length;
*table=t;
}
// 无序表的输入
void FillTable(SSTable *table)
{
ElemType *t=table->elem;
//for循环,输入各个元素
for(int i=0; ilength; i++)
{
t++;
scanf("%d", t);//输入元素
getchar();
}
}
// 销毁表
void Destroy(SSTable *table)
{
free(table->elem);//释放元素空间
free(table);//释放表的空间
}
// 打印查找表
void PrintTable(SSTable *table)
{
int i;//定义变量
ElemType *t=table->elem;
for(i=0; ilength; i++)//进入循环,依次打印表中元素
{
t++;
printf("%d ", *t);//打印输出
}
printf("\n");
}
//哨兵查找算法
int Search_Seq(SSTable *table, ElemType key)
{
table->elem[0]=key;//设置哨兵
int result=0; // 找不到时,返回
int i;
for (i=table->length; i>=1;i--)
{
if (table->elem[i]==key)
{
result=i;
break;
}
}
return result;//返回结果
}
void printSeq()
{
//先设置几个变量
SSTable *table;
int r;
int n;
ElemType key;
printf("请输入元素个数:");
scanf("%d",&n);//输入元素个数
Create(&table, n);//建立表
printf("请输入");cout<0)
{
printf(" 关键字%d 在表中的位置是:%d\n",key, r);//打印关键字在表中的位置
printf("\n");
}
else //查找失败
{
printf ("查找失败,表中无此数据。\n\n");
}
}
// 排序算法
void Sort(SSTable *table )
{
int i, j;
ElemType temp;
for (i=table->length; i>=1 ;i--) // 从前往后找
{
for (j=1; jelem[j]>table->elem[j+1])
{
temp=table->elem[j];
table->elem[j]=table->elem[j+1];
table->elem[j+1]=temp;
}
}
}
}
// 二分法查找(非递归)
int Search_Bin(SSTable *table, ElemType key)
{
int low=1;
int high=table->length;
int result=0; // 找不到时,返回
while(low <= high)//low不大于high时
{
int mid=(low+high)/2;
if(table->elem[mid]==key)//如果找到
{
result=mid;
break;
}
else if(keyelem[mid])//如果关键字小于mid对应的值
{
high=mid-1;
}
else //否则的话
{
low=mid+1;
}
}
return result;//返回结果
}
void printBin()
{
//声明变量
SSTable *table;
int r;
int n;
ElemType key;
printf("请输入元素个数:");
scanf("%d",&n);
Create(&table, n);//建立表
printf("请输入");cout<0)
printf("关键字%d 在表中的位置是:%d\n",key, r);
else
{
printf ("查找失败,表中无此数据。\n\n");
}
}
//二叉排序树
typedef struct BiTnode //定义二叉树节点
{
int data; //节点的值
struct BiTnode *lchild,*rchild;//节点的左孩子,节点的右孩子
}BiTnode,*BiTree;
//查找(根据节点的值查找)返回节点指针
BiTree search_tree(BiTree T,int keyword,BiTree *father)
{
BiTree p;// 临时指针变量
*father = NULL;//先设其父亲节点指向空
p = T;//p赋值为根节点(从根节点开始查找)
while (p && p->data!=keyword)//如果不是p不指向空且未找到相同值的节点
{
*father = p;//先将父亲指向自己(注意:这里传过来的father是二级指针)
if (keyword < p->data)//如果要找的值小于自己的值
p = p->lchild;// 就向自己的左孩子开始找
else
p = p->rchild;//否则向自己的右孩子开始查找
}
return p;//如果找到了则返回节点指针
}
BiTree creat_tree(int count)
{
BiTree T,p;//设置两个临时变量T,p
int i = 1;
while (i <= count)
{
if (i == 1)//如果i=1,说明还是空树
{
p = (BiTnode *)malloc(sizeof(BiTree));//使p指向新分配的节点
if (!p)//分配未成功
return NULL;
T = p;//分配成功,T=p( 这里实际上T就是根节点)
scanf("%d",&p->data);//输入p指向节点的值
p->lchild = p->rchild = NULL;//p的左孩子和右孩子都指向空
i++;
}
else
{
int temp;// 如果不是空树
scanf("%d",&temp);//输入节点的值
search_tree(T,temp,&p);//查找节点要插入的位置。(T是根节点,插入的节点的值,父亲节点的地址)
if (temp < p->data)//如果插入的值小于父亲节点的值
{
p->lchild = (BiTnode *)malloc(sizeof(BiTnode));//那么就为父亲节点的左孩子分配一个节点空间,并指向这个空间
if (!p->lchild)
return NULL;
p = p->lchild;//分配成功,p指向自己的左孩子
}
else// 如果插入的值大于父亲节点的值
{
p->rchild = (BiTnode *)malloc(sizeof(BiTnode));
if (!p->rchild)
return NULL;//分配不成功,退出
p = p->rchild;//p指向自己的右孩子
}
p -> data = temp;//新分配的节点的值赋值为插入的值
p -> lchild = p->rchild = NULL;//使其左右节点均为NULL
i++;
}
}
return T;//返回根节点
}
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
printf("%d ",T->data);
InOrder(T->rchild);
}
}
int insert_tree(BiTree *T,int elem)//插入(根节点,插入的值)返回-1和,-1代表插入失败,代表成功
{
BiTree s,p,father;
s = (BiTnode *)malloc(sizeof(BiTnode));//s指向新开辟一个节点
if (!s)//为开辟成功
return -1;// 返回值-1
s->data = elem;//新节点的值赋值为插入的值
s->lchild = s->rchild = NULL;//其左右孩子为空
p = search_tree(*T,elem,&father);//p赋值为要插入的节点
if (!p)
return -1;//未开辟成功,返回-1
if (father == NULL)//如果父亲节点指向空,说明是空树
*T = s;//让根节点指向s
else if (elem < father->data)//否则如果插入的值小于父亲的值
father->lchild = s;//父亲的左孩子赋值为s
else
father->rchild = s;//否则父亲的右孩子赋值为s
return 0;//返回
}
//删除树结点的操作
int delete_tree(BiTree *T,int elem)
{
BiTree s,p,q,father;//声明变量
p = search_tree(*T,elem,&father);//查找
if(!p)
return -1;
if(!p->lchild)//如果p的左孩子为空
{
if (father == NULL)
{
*T = p->rchild;//T指向左孩子
free(p);//释放p
return 0;
}
if (p == father->lchild)//如果p和father的左孩子相等
father->lchild = p->rchild; //将p的左孩子的值赋给father的左孩子
else
father->rchild = p->rchild;//将p的左孩子的值赋给father的右孩子
free(p);//释放p
return 0;
}
else
if(!p->rchild)
{
if (father == NULL)//如果father为空
{
*T = p->lchild;//将p的左孩子赋给T
free(p);//释放p
return 0;
}
if (p == father->lchild)//如果p等于father的左孩子的值
father->lchild = p->lchild; //将p的左孩子的值赋给father的左孩子
else
father->rchild = p->lchild; //将p的左孩子的值赋给father的右孩子
free(p);
return 0;
}
else
{
q = p;
s = p->lchild;//将p的左孩子赋给s
while (s->rchild)
{
q = s;
s = s->rchild;
}
p->data = s->data;//将s的值赋给p
if (q != p)//如果q不等于p
q->rchild = s->lchild; //将s的左孩子值赋给p的右孩子
else
q->lchild = s->lchild; //将s的左孩子值赋给p的右孩子
free(s);//释放s
return 0;
}
}
//定义print1()以便调用
void print1()
{
printf("\t**********************\n");
printf("\t1,输出中序遍历\n");
printf("\t2,插入一个结点\n");
printf("\t3,删除一个结点\n");
printf("\t4,查找一个结点\n");
printf("\t5,返回主菜单\n");
printf("\t**********************\n");
}
void printTree()
{
//声明变量
BiTree T,p;
T=NULL;
int i,n;
ElemType key;
printf("请输入结点个数:\n");
scanf("%d",&n);//输入值
printf("请输入");cout<=0) return q;
else i=c/2+1;
}
else{
q=(p-i*i)%MAX;
c++;
if(q>=0) return q;
else i=c/2+1;
}
}
return 0;
}
void InitHash(HashTable *H)//创建哈希表
{
int i;
H->elem=(Elemtype *)malloc(MAX*sizeof(Elemtype));
H->count=0;
H->sizeindex=MAX;
for(i=0;ielem[i].num=0;//初始化,使SearHash函数能判断到底有没有元素在里面
}
int SearHash(HashTable H,int key,int *p)//查找函数
{
*p=Hash(key);
while(H.elem[*p].num!=key&&H.elem[*p].num!=0)
*p=*p+1;
if(H.elem[*p].num==key)
return 1;
else
return 0;
}
void InsertHash(HashTable *H,Elemtype e)
{//如果查找不到就插入元素
int p;
SearHash(*H,e.num,&p); //查找
H->elem[p]=e;
++H->count;
}
void printHash()//调用哈希表
{
HashTable H;
int p,key,i,n;
Elemtype e;
InitHash(&H);
printf("输入数据个数(<11 ):");
scanf("%d",&n);
printf("请输入各个值:");
for(i=0;i