循环队列 链式队列 哈希表 折半查找

head.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10
typedef int datatype;
typedef struct
{
	datatype data[MAXSIZE];
	int front;
	int rear;
}* queue,queuelist;
queue create();
typedef struct Node
{
	union
	{
		int len;
		datatype data;
	};
	struct Node * next;
}*Linklist;
typedef struct
{
	Linklist front;
	Linklist rear;
}*Linkque,Queue;

void menu1(queue q);
void menu2(queue q);
void menu3(Linkque que);
int enqueue(queue q,datatype e);
int dequeue(queue q);
void Output1(queue q);
int loop_enqueue(queue q,datatype e);
int loop_dequeue(queue q);
void loop_Output1(queue q);
Linkque Create_Node();
Linklist Create_node();
int Linkque_enhead(Linkque que,datatype e);
int Linkque_de(Linkque que);
void Linkque_Output(Linkque que);
int search_half(int arr[],int low,int high,int key);

main.c

include "head8.h"
int main(int argc, const char *argv[])
{
	queue q=create();
	Linkque que=Create_Node();
	while(1)
	{
		puts("\t-------------------------");
		puts("\t1,顺序队列");
		puts("\t2,循环队列");
		puts("\t3,链式对列");
		puts("\t4,折半查找");
		puts("\t0,退出程序");
		int num;
		printf("请输入你的选择:");
		scanf("%d",&num);
		switch(num)
		{
		case 1:q->front=q->rear;
			menu1(q);
			break;
		case 2:q->front=q->rear;
			menu2(q);
			break;
		case 3: 
			menu3(que);
			int que=free_space(que);
			break;
		case 4:
			{
			int arr[]={10,20,1,11,31,45,12};
			int len;
			len=sizeof(arr)/sizeof(int);
				int key;
			printf("请输入需要查找的值");
			scanf("%d",&key);
	    	int sub=search_half(arr,0,len-1,key);
		   if(sub==-1)
	    	{
			printf("查找不存在");
	    	}
	    	else
	     	{
			printf("下标为%d\n",sub);
		    }
			}
			break;
		case 0:
			return 0;
		default:printf("输入错误,请重新输入:");
			break;
		}
			
	}
	return 0;
}

test.c

#include "head8.h"
queue create()
{
	queue q=(queue)malloc(sizeof(queuelist));
	if(q==NULL)
		return NULL;
	q->front=q->rear=0;
	return q;
}
void menu1(queue q)
{
	datatype e; 
	while(1)
	{
		puts("\t---------------------------");
		puts("\t1,顺序队列入队");
		puts("\t2,顺序队列删除");
		puts("\t3,顺序队列遍历");
		puts("\t0,返回上一级菜单");
		int num;
		printf("请输入你的选择");
		scanf("%d",&num);
		switch(num)
		{

		case 1:	printf("请输入值");
				scanf("%d",&e);
		     	enqueue(q,e);
			  	break;
		case 2:dequeue(q);
			break;
		case 3:Output1(q);
			break;
		case 0:
			return;
		default:printf("输入错误,请重新输入:");
			break;
		}

	}
}
void menu2(queue q)
{
	datatype e;
	while(1)
	{
		puts("\t---------------------------");
		puts("\t1,循环队列入队");
		puts("\t2,循环队列删除");
		puts("\t3,循环队列遍历");
		puts("\t0,返回上一级菜单");
		int num;
		printf("请输入你的选择");
		scanf("%d",&num);
		switch(num)
		{
		case 1:printf("请输入要输入的值:");
			   scanf("%d",&e);
			loop_enqueue(q,e);
			break;
		case 2:loop_dequeue(q);
			break;
		case 3: loop_Output1(q);
			break;
		case 0:
			return;
		default:printf("输入错误,请重新输入:");
			break;
		}
	}
}
void menu3(Linkque que)
{
	datatype e;
	while(1)
	{
		puts("\t---------------------------");
		puts("\t1,链式队列入队");
		puts("\t2 链式队列删除");
		puts("\t3 链式队列遍历");
		puts("\t0,返回上一级菜单");
		int num;
		printf("请输入你的选择");
		scanf("%d",&num);
		switch(num)
		{
		case 1:
			printf("请输入要输入的值");
			scanf("%d",&e);
			Linkque_enhead(que,e);
			break;
		case 2:Linkque_de(que);
			break;
		case 3:Linkque_Output(que);
			break;
		case 0:
			return;
		default:printf("输入错误,请重新输入:");
			break;
		}
	}
}
//顺序队列入队
int enqueue(queue q,datatype e)
{
	if(q->rear==MAXSIZE||q==NULL)
	{
		printf("队列已满\n");
		return -1;
	}
	q->data[q->rear++]=e;
	return 0;
}
//顺序队列删除(出队)
int dequeue(queue q)
{
	if(q->front==q->rear||q==NULL)
	{
		printf("队列为空\n");
		return -1;
	}
	printf("出队的元素是:%d\n",q->data[q->front++]);
	return 0;
}
//顺序队列遍历
void Output1(queue q)
{
	if(q->front==q->rear)
	 	printf("遍历为空");
	for(int i=q->front;i<q->rear;i++)
	{
		printf("%d\t",q->data[i]);
	}
	printf("\n");
}
//循环队列入队
int loop_enqueue(queue q,datatype e)
{
	if((q->rear+1)%MAXSIZE==q->front||q==NULL)
	{
		printf("队列已满\n");
		return -1;
	}
	q->data[q->rear]=e;
	q->rear=(q->rear+1)%MAXSIZE;
	return 0;
}
//循环队列删除(出队)
int loop_dequeue(queue q)
{
	if(q->front==q->rear||q==NULL)
	{
		printf("队列为空\n");
		return -1;
	}
	printf("出队的元素是:%d\n",q->data[q->front]);
	q->front=(q->front+1)%MAXSIZE;
	return 0;
}
//循环队列遍历
void loop_Output1(queue q)
{
	if(q->front==q->rear)

	{
	 	printf("遍历为空");
		return;
	}
	for(int i=q->front;i!=q->rear;i=(i+1)%MAXSIZE)
	{
		printf("%d\t",q->data[i]);
	}
	printf("\n");
}
//申请堆区空间
Linkque Create_Node()
{
	Linkque que=(Linkque)malloc(sizeof(Queue));
	if(que==NULL)
		return NULL;
	Linklist L=(Linklist)malloc(sizeof(struct Node));
	if(L==NULL)
		return NULL;
	L->len=0;
	L->next=NULL;
	que->front=L;
	que->rear=L;

	return que;
}
Linklist Create_node()
{
	Linklist p=(Linklist)malloc(sizeof(struct Node));
	if(p==NULL)
		return NULL;
	p->data=0;
	p->next=NULL;
	return p;
}
//链式队列入队
int Linkque_enhead(Linkque que,datatype e)
{
	if(que==NULL)
		return -1;
	Linklist p=Create_node();
	if(p==NULL)
		return -1;
	p->data=e;
	que->rear->next=p;
	que->rear=p;
	que->front->len++;
	return 0;
}
//链式队列删除
int Linkque_de(Linkque que)
{
	if(que==NULL||que->front==que->rear)
		return -1;
	if(que->front->next==que->rear)
		que->rear=que->front;
	Linklist s=que->front->next;
	printf("出队的元素是%d\n",s->data);
	que->front->next=s->next;
	free(s);
	s=NULL;
	que->front->len--;
	return 0;
}
//链式队列的遍历
void Linkque_Output(Linkque que)
{
	if(que->front==que->rear)
	{
		printf("遍历为空");
		return;
	}
	Linklist p=que->front;
	while(p->next!=NULL)
	{
		p=p->next;
		printf("%d\t",p->data);
	}
}
//折半查找
int search_half(int arr[],int low,int high,int key)
{
	int mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(arr[mid]<key)
		{
			low=mid+1;
		}
		else if(arr[mid]>key)
		{
			high=mid-1;
		}
		else if(arr[mid]==key)
		{
			return mid;
		}
	}
 return -1;
}
//链式对列的空间释放
Linkque free_space(Linkque que)
{
	if(que==NULL)
		return NULL;
	int n=que->front->len;
	for(int i=0;i<n;i++)
	{
		Linkque_de(que);
	}
	free(que->front);
	que->front=NULL;
	free(que);
	que=NULL;
	return que;
}

head2.h


#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node
{
	int data;
	struct Node *next;
}*node;

int p;
void Init(node hash[],int Hash_len);
int max_prime(int m);
int insert_hash(int key,node hash,int Hash_len);
void Output(node hash,int Hash_len);
void search(int key,node hash[]);


#endif

main2.c

#include "head9.h"
int main(int argc, const char *argv[])
{
	int arr[]={1,22,199,20,30,356,223,1244};
	int len=sizeof(arr)/sizeof(int);
	//哈希表的长度
	int Hash_len=len*4/3;
	node hash[Hash_len];//指针数组
	Init(hash,Hash_len);//初始化哈希表
	for(int i=0;i<len;i++)
	{
		insert_hash(arr[i],hash,Hash_len);
	}
	Output(hash,Hash_len);
	int key;
	printf("请输入你要查找的值:");
	scanf("%d",&key);
	search(key,hash);
	return 0;
}

test2.c

#include "head9.h"
void Init(node hash[],int Hash_len)
{
	for(int i=0;i<Hash_len;i++)
	{
		hash[i]=NULL;
	}
}
//找到最大的素数
int max_prime(int Hash_len)
{
	for(int i=Hash_len;i>=2;i--)
	{
		int count=0;
		for(int j=1;j<i;j++)
		{
			if(i%j==0)
				count++;
		}
		if(count==2)
			return i;
	}
}
//把数组元素存储到哈希表中
int insert_hash(int key,node hash,int Hash_len)
{
	p=max_prime(Hash_len);
	int sub=key%p;
	//在hash[sub]中头插
	node s=(node)malloc(sizeof(struct Node));
	//s的数据域
	s->data=key;
	s->next=hash[sub];
	hash[sub]=s;
}
//哈希表遍历
void Output(node hash,int Hash_len)
{
	for(int i=0;i<hash;i++)
	{
		printf("%d",i);
		node p=hash[i];
		while(p!=NULL)
		{
			printf("%d\t",p->data);
			p=p->next;
		}
		printf("\n");
	}
}
//哈希查找
void search(int key,node hash[])
{
	int sub=key%p;
	node q=hash[sub];
	while(q!=NULL)
	{
		if(q->data==key)
		{
			printf("存在你要查找的值");
			return;
		}
		q->next;
	}
	printf("值不存在");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值