数据结构day7

本文介绍了如何用C语言实现二叉树的节点创建、前序、中序和后序遍历,以及快速排序、插入排序、二分查找和哈希查找等基本算法。
摘要由CSDN通过智能技术生成

1.二叉树

#include "binary_tree.h"


/*------------二叉树新结点的创建------------*/
node_p create_new_node_dinary_tree(datatype newdata)
{
	node_p New_node=(node_p)malloc(sizeof(node));
	if(New_node==NULL)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	New_node->data=newdata;
	New_node->lchild=NULL;
	New_node->rchild=NULL;
	return New_node;
}


/*---------------二叉树的创建---------------*/
node_p create_dinary_tree(void)
{
	datatype newdata='\0';
	printf("请输入\n");
	scanf("%c",&newdata);
	getchar();
	if(newdata=='#')
	{
		return NULL;
	}
	node_p Root_node=create_new_node_dinary_tree(newdata);
	printf("左子树");
	Root_node->lchild=create_dinary_tree();
	printf("右子树");
	Root_node->rchild=create_dinary_tree();
	return Root_node;
}


/*------------二叉树的前序遍历-------------*/
void show_preorder(node_p Root_node)
{
	if(Root_node==NULL)
	{
		return;
	}
	printf("%c\t",Root_node->data);
	show_preorder(Root_node->lchild);
	show_preorder(Root_node->rchild);
}


/*------------二叉树的中序遍历-------------*/
void show_inorder(node_p Root_node)
{
	if(Root_node==NULL)
	{
		return;
	}
	show_inorder(Root_node->lchild);
	printf("%c\t",Root_node->data);	
	show_inorder(Root_node->rchild);
}


/*------------二叉树的后序遍历-------------*/
void show_postorder(node_p Root_node)
{
	if(Root_node==NULL)
	{
		return;
	}
	show_postorder(Root_node->lchild);
	show_postorder(Root_node->rchild);
}

2.快速查找

/*------------一次快排-----------*/
int once_quick_sort(int* arr,int low,int high)
{
	int basic=*(arr+low);
	while(high!=low)
	{
		while(high>low&&basic<*(arr+high))
		{
			high--;
		}
		*(arr+low)=*(arr+high);
		while(high>low&&basic>*(arr+low))
		{
			low++;
		}
		*(arr+high)=*(arr+low);
	}
	*(arr+low)=basic;
	return low;
}


/*------------整体快排-----------*/
void quick_sort(int* arr,int low,int high)
{
	if(high>low)
	{
		int ret=once_quick_sort(arr,low,high);
		quick_sort(arr,low,ret-1);
		quick_sort(arr,ret+1,high);
	}
}

3.直接插入查找

void insert_sort(int* arr,int len)
{
	int i,j,t;
	for(i=1;i<len;i++)
	{
		t=*(arr+i);
		for(j=i;j>0&&*(arr+j-1)>t;j--)
		{
			*(arr+j)=*(arr+j-1);
		}
		*(arr+j)=t;
	}
}

 4.二分查找

int dinary_search(int* arr,int low,int high,int keyword)
{
	while(high>=low)
	{
		int mid=(low+high)/2;
		if(*(arr+mid)==keyword)
		{
			return mid;
		}
		else if(*(arr+mid)>keyword)
		{
			high=mid-1;
		}
		else if(*(arr+mid)<keyword)
		{
			low=mid+1;
		}
	}
	return -1;
}

 5.哈希查找

/*------------创建新结点------------*/
node_p create_new_node(newdata)
{
	node_p New_node=(node_p)malloc(sizeof(node));
	if(New_node==NULL)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	New_node->data=newdata;
	New_node->next=NULL;
	return New_node;
}


/*------------存入哈希表-----------*/
void insert_hash_chart(node_p* Hash_chart,int keyword)
{
	int i=keyword%MAX;
	node_p New_node=create_new_node(keyword);
	New_node->next=*(Hash_chart+i);
	*(Hash_chart+i)=New_node;
}


/*------------输出哈希表-----------*/
void show_hash_chart(node_p* Hash_chart)
{
	if(Hash_chart==NULL)
	{
		printf("参数为空,请检查\n");
		return;
	}
	int i;
	for(i=0;i<MAX;i++)
	{
		node_p Hash_node=*(Hash_chart+i);
		while(Hash_node!=NULL)
		{
			printf("%d-->",Hash_node->data);
			Hash_node=Hash_node->next;
		}
		printf("NULL\n");
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值