顺序队列,循环队列,链式队列
head.h
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 4
typedef int datatype;
typedef struct{
datatype data[MAXSIZE];
//队头
int front;
//队尾
int rear;
}*Queue,queuelist;
Queue Creat_space();
void menu1();
int Enqueue(Queue q,datatype e);
int Dequeue(Queue q);
void Output_queue(Queue q);
void menu2();
int Enqueue_loop(Queue q,datatype e);
int Dequeue_loop(Queue q);
void Output_loop(Queue q);
int len(Queue q);
typedef struct Node{
union{
int len;
datatype data;
};
struct Node* next;
}*queuenode;
typedef struct{
queuenode front;
queuenode rear;
}*Linkqueue,link_queue;
void menu3();
Linkqueue creat_head();
queuenode creat_node();
int Enqueue_Link(Linkqueue qhead,datatype e);
void Output_queue_Link(Linkqueue qhead);
int Dequeue_Link(Linkqueue qhead);
Linkqueue free_Linlqueue(Linkqueue qhead);
#endif
main.c
#include"queue.h"
int main(int argc,const char *argv[])
{
int num=0;
//顺序队列定义
//申请空间
Linkqueue qhead=creat_head();
while(1){
puts("------------------------------");
puts("\t队列的操作:");
puts("\t1、顺序队列");
puts("\t2、循环队列");
puts("\t3、链式队列");
puts("\t0、退出程序");
printf("请输入操作:");
scanf("%d",&num);
switch(num){
case 0:return 0;
case 1:
menu1();
break;
case 2:
menu2();
break;
case 3:
menu3(qhead);
qhead=free_Linlqueue(qhead);
break;
default:
printf("输入操作错误,请重新输入\n");
}
}
return 0;
}
txt.c
#include"queue.h"
/*
*function : 申请空间
*@param [in]: 无参数
*@param [out]:
*@return : 成功返回申请的空间的地址,失败返回NULL
*/
Queue Creat_space(){
Queue q=(Queue)malloc(sizeof(queuelist));
if(q==NULL)
return NULL;
q->front=q->rear=0;
return q;
}
/*
*function : 顺序队列菜单
*@param [in]: 顺序队列
*@param [out]:
*@return :
*/
void menu1(){
int num=0;
datatype e;
int flag=0;
Queue q=Creat_space();
while(1){
puts("********************************");
puts("\t顺序队列的操作:");
puts("\t1、顺序队列入队");
puts("\t2、顺序队列出队");
puts("\t3、顺序队列的遍历");
puts("\t0、返回上一级菜单");
printf("请输入操作:");
scanf("%d",&num);
switch(num){
case 0:
free(q);
q=NULL;
printf("已经返回上一级菜单\n");
return;
case 1:
printf("请输入入队的元素:");
scanf("%d",&e);
flag=Enqueue(q,e);
if(flag==-1)
printf("队满,顺序队列入队失败\n");
break;
case 2:
flag=Dequeue(q);
if(flag==-1)
printf("队空,顺序队列出队失败\n");
break;
case 3:
Output_queue(q);
break;
default:
printf("输入操作错误,请重新输入\n");
break;
}
}
}
/*
*function : 顺序队列入队
*@param [in]: 顺序队列,入队的元素
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int Enqueue(Queue q,datatype e){
//判满
if(q->rear==MAXSIZE||q==NULL)
return -1;
q->data[q->rear++]=e;
return 0;
}
/*
*function : 顺序队列出队
*@param [in]: 顺序队列
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int Dequeue(Queue q){
//判空
if(q->front==q->rear)
return -1;
printf("出队的元素为:%d\n",q->data[q->front++]);
return 0;
}
/*
*function : 顺序队列的遍历
*@param [in]: 顺序队列
*@param [out]:
*@return : 无返回值
*/
void Output_queue(Queue q){
//判空
if(q->front==q->rear)
return;
for(int i=q->front;i<q->rear;i++){
printf("%d\t",q->data[i]);
}
printf("\n");
}
/*
*function : 循环队列菜单
*@param [in]: 循环队列
*@param [out]:
*@return :
*/
void menu2(){
int num=0;
datatype e;
int flag=0;
Queue q=Creat_space();
while(1){
puts("********************************");
puts("\t循环队列的操作:");
puts("\t1、循环队列入队");
puts("\t2、循环队列出队");
puts("\t3、循环队列的遍历");
puts("\t4、循环队列的元素个数");
puts("\t0、返回上一级菜单");
printf("请输入操作:");
scanf("%d",&num);
switch(num){
case 0:
free(q);
q=NULL;
printf("已经返回上一级菜单\n");
return;
case 1:
printf("请输入入队的元素:");
scanf("%d",&e);
flag=Enqueue_loop(q,e);
if(flag==-1)
printf("队满,循环队列入队失败\n");
break;
case 2:
flag=Dequeue_loop(q);
if(flag==-1)
printf("队空,循环队列出队失败\n");
break;
case 3:
Output_loop(q);
break;
case 4:
printf("队列元素个数:%d\n",len(q));
break;
default:
printf("输入操作错误,请重新输入\n");
break;
}
}
}
/*
*function : 循环队列入队
*@param [in]: 循环队列,入队的元素
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int Enqueue_loop(Queue q,datatype e){
//判满
if(q->front==(q->rear+1)%MAXSIZE||q==NULL)
return -1;
q->data[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
return 0;
}
/*
*function : 循环队列出队
*@param [in]: 循环队列
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int Dequeue_loop(Queue q){
//判空
if(q->front==q->rear)
return -1;
printf("出队的元素为:%d\n",q->data[q->front]);
q->front=(q->front+1)%MAXSIZE;
return 0;
}
/*
*function : 循环队列的遍历
*@param [in]: 循环队列
*@param [out]:
*@return : 无返回值
*/
void Output_loop(Queue q){
//判空
if(q->front==q->rear)
return;
for(int i=q->front;i!=q->rear;i=(i+1)%MAXSIZE){
printf("%d\t",q->data[i]);
}
printf("\n");
}
/*
*function : 循环队列的元素个数
*@param [in]: 循环队列
*@param [out]:
*@return :
*/
int len(Queue q){
return(MAXSIZE-q->front+q->rear)%MAXSIZE;
}
/*
*function : 链式队列菜单
*@param [in]: 链式队列
*@param [out]:
*@return :
*/
void menu3(Linkqueue qhead){
int num=0;
datatype e;
int flag=0;
while(1){
puts("********************************");
puts("\t链式队列的操作:");
puts("\t1、链式队列入队");
puts("\t2、链式队列出队");
puts("\t3、链式队列的遍历");
puts("\t0、返回上一级菜单");
printf("请输入操作:");
scanf("%d",&num);
switch(num){
case 0:
printf("已经返回上一级菜单\n");
return;
case 1:
printf("请输入入队的元素:");
scanf("%d",&e);
flag=Enqueue_Link(qhead,e);
if(flag==-1)
printf("链式入队失败\n");
break;
case 2:
flag=Dequeue_Link(qhead);
if(flag==-1)
printf("链式出队失败\n");
break;
case 3:
Output_queue_Link(qhead);
break;
default:
printf("输入操作错误,请重新输入\n");
break;
}
}
}
/*
*function : 链式队列的创建
*@param [in]:
*@param [out]:
*@return : 成功返回申请的空间的地址,失败返回NULL
*/
Linkqueue creat_head(){
Linkqueue qhead=(Linkqueue)malloc(sizeof(link_queue));
if(qhead==NULL)
return NULL;
qhead->front=(queuenode)malloc(sizeof(struct Node));
if(qhead->front==NULL)
return NULL;
qhead->rear=qhead->front;
qhead->front->len=0;
qhead->front->next=NULL;
return qhead;
}
/*
*function : 链式队列普通结点的创建
*@param [in]:
*@param [out]:
*@return : 成功返回申请的空间的地址,失败返回NULL
*/
queuenode creat_node(){
queuenode p=(queuenode)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
p->next=NULL;
return NULL;
}
/*
*function : 链式队列入队
*@param [in]: 链式队列,入队的元素
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int Enqueue_Link(Linkqueue qhead,datatype e){
if(qhead==NULL)
return -1;
//创建新结点
queuenode s=(queuenode)malloc(sizeof(struct Node));
if(s==NULL)
return -1;
//s的数据域赋值
s->data=e;
//s的指针域
s->next=qhead->rear->next;
qhead->rear->next=s;
qhead->front->len++;
qhead->rear=s;
return 0;
}
/*
*function : 链式队列的遍历
*@param [in]: 链式队列
*@param [out]:
*@return : 无返回值
*/
void Output_queue_Link(Linkqueue qhead){
if(qhead==NULL)
return;
queuenode s=qhead->front;
for(int i=0;i<qhead->front->len;i++){
s=s->next;
printf("%d\t",s->data);
}
printf("\n");
}
/*
*function : 链式队列出队
*@param [in]: 链式队列
*@param [out]:
*@return : 成功返回0,失败返回-1
*/
int Dequeue_Link(Linkqueue qhead){
if(qhead==NULL||qhead->front->len==0)
return -1;
if(qhead->front->next==qhead->rear)
qhead->rear=qhead->front;
queuenode s=qhead->front->next;
printf("出队的元素是:%d\n",s->data);
qhead->front->next=s->next;
free(s);
s=NULL;
qhead->front->len--;
return 0;
}
/*
*function : 链式队列空间释放
*@param [in]: 链式队列
*@param [out]:
*@return : 返回NULL
*/
Linkqueue free_Linlqueue(Linkqueue qhead){
if(qhead==NULL)
return NULL;
int n=qhead->front->len;
for(int i=0;i<n;i++){
Dequeue_Link(qhead);
}
free(qhead->front);
qhead->front=NULL;
free(qhead);
qhead=NULL;
return NULL;
}
哈希表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int datatype;
//定义一个结点结构体
typedef struct Node{
datatype data;
struct Node *next;
}*node;
/*
*function : 初始化哈希表
*@param [in]: 哈希表,哈希表长
*@param [out]:
*@return : 无返回值
*/
void Init_hash(node hash[],int hash_len){
for(int i=0;i<hash_len;i++){
hash[i]=NULL;
}
}
/*
*function : 找最大质数
*@param [in]: 哈希表长
*@param [out]:
*@return : 返回最大质数,失败返回-1
*/
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;
}
return -1;
}
/*
*function : 将元素放入哈希表
*@param [in]: 哈希表,元素
*@param [out]:
*@return : 无返回值
*/
void insert_hash(node hash[],int e,int hash_len){
//计算不大于哈希表长的最大质数
int m=max_prime(hash_len);
//计算元素对应的下标
int index=e%m;
//创建一个新结点
node s=(node)malloc(sizeof(struct Node));
//给s结点数据域赋值
s->data=e;
//s的指针域
s->next=hash[index];
hash[index]=s;
}
/*
*function : 哈希表遍历
*@param [in]: 哈希表
*@param [out]:
*@return : 无返回值
*/
void Output_hash(node hash[],int hash_len){
for(int i=0;i<hash_len;i++){
printf("%d:",i);
node p=hash[i];
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
}
/*
*function : 哈希表查询
*@param [in]: 哈希表,查找元素
*@param [out]:
*@return : 无返回值
*/
void search_hash(node hash[],datatype e,int hash_len){
int index=e%(max_prime(hash_len));
node p=hash[index];
while(p){
if(p->data==e){
printf("存在该元素\n");
return ;
}
p=p->next;
}
printf("不存在该元素\n");
}
int main(int argc,const char *argv[])
{
int arr[]={11,46,27,55,89,1111,998};
//计算数组长度
int len=sizeof(arr)/sizeof(arr[0]);
//计算哈希长度
int hash_len=len*4/3;
//创建一个哈希表,是一个指针数组
node hash[hash_len];
//初始化哈希表
Init_hash(hash,hash_len);
//将元素放进哈希表
for(int i=0;i<len;i++){
insert_hash(hash,arr[i],hash_len);
}
//哈希表遍历
Output_hash(hash,hash_len);
//哈希查找
datatype e;
printf("请输入要查找的数据:");
scanf("%d",&e);
search_hash(hash,e,hash_len);
return 0;
}
折半查找
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int half_find(int *p,int num);
#endif
main.c
#include"head.h"
int main(int argc,const char *argv[])
{
int arr[7]={90,80,70,60,50,40,30};
int num=0;
printf("请输入要查找的值:");
scanf("%d",&num);
int index=half_find(arr,num);
if(index==-1)
printf("没有该元素\n");
else
printf("该元素出现的下标为:%d\n",index);
return 0;
}
txt.c
#include"head.h"
/*
*function : 折半查找
*@param [in]: 数组,查找的元素
*@param [out]:
*@return : 成功返回下标,失败返回-1
*/
int half_find(int *p,int num){
int mid,low=0,high=6;
while(low<=high){
mid=(low+high)/2;
if(*(p+mid)>num)
low=mid+1;
else if(*(p+mid)<num)
high=mid-1;
else
return mid;
}
return -1;
}