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("值不存在");
}