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

顺序队列,循环队列,链式队列

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值