zoukankan      html  css  js  c++  java
  • 数据结构实验报告-实验五 查找

    实验五   查找

     

    实验目的

    1、 查找的基本概念

    1. 掌握在数组上进行各种查找的方法和算法。
    2. 深刻理解各种方法的特点,并能灵活运用。
    3. 加深对查找的理解,逐步培养解决实际问题的能力。

    实验内容

    1、查找的基本概念

    (一)基础题

    1.编写各种查找方法的基本操作函数:

    (1)search1(int *k,int n,int key)无序线性表的顺序查找;

    (2)search2(int *k,int n,int key)有序线性表的顺序查找;

    (3)bin_search(int *k,int n,int key)二分法查找。

    2.调用上述函数实现下列操作:

    (1)对于给定的数组E[N]={213,111,222,77,400,300,987,1024,632,555}调用无序线性表的顺序查找函数进行查找;

    (2)调用有序线性表的顺序查找函数进行查找;

    (3)调用二分法查找函数进行查找。

    (二)提高题

    【问题描述】采用随机函数产生职工的工号和他所完成产品个数的数据信息,对同一职工多次完成的产品个数进行累计,最后按“职工完成产品数量的名次,该名次每位职工完成的产品数量,同一名次的职工人数和他们的职工号”的格式输出。

    【实现要求】输出统计结果,如下所示:

    ORDER      QUANTITY    COUNT      NUMBER

    1                 375        3            10         20     21

    4                 250        2            3           5    

    6                 200        1             9      

    7                 150        2             11          14

       

    实验结果

    1、查找的基本概念

    (一)基础题

    (1)画出数据结构基本运算的流程图

                                      

     
       

    (2)程序运行主要结果截图

    (3)程序源代码

    #include<stdio.h>
    
    #include<conio.h>
    
    #define N 10
    
    int E[N]={213,111,222,77,400,300,987,1024,632,555};
    
    void s_sort(int e[],int n)/*e:存储线性表的数组;n:线性表的结点个数*/
    
    {
    
        int i,j,k,t;
    
        for(i=0;i<n-1;i++)
    
        {
    
            for(k=i,j=i+1;j<n;j++)
    
                if(e[k]>e[j])
    
                k=j;
    
            if(k!=i)
    
            {
    
                t=e[i];
    
                e[i]=e[k];
    
                e[k]=t;
    
            }
    
        }
    
    }
    
    int search1(int *k,int n,int key) /*无序线性表的顺序查找*/
    
    {
    
        int i;
    
        for(i=0;i<n;i++)
    
            if(key==k[i])
    
            return i;
    
     
    
        return -1;
    
     
    
    }
    
    int search2(int *k,int n,int key)/*有序线性表的顺序查找*/
    
    {
    
        int i;
    
        for(i=0;i<n&&key>k[i];i++)
    
            if(i<n&&k[i]==key)
    
            return i;
    
     
    
    return -1;
    
     
    
    }
    
    int bin_search(int *k,int n,int key)/*二分法查找*/
    
    {
    
        int low=0,high=n-1,mid;
    
        while(low<=high)
    
        {
    
            mid=(low+high)/2;
    
            if(key==k[mid])
    
                return mid;
    
            if(key>k[mid])
    
                low=mid+1;
    
            else
    
                high=mid-1;
    
        }
    
        return -1;
    
    }
    
    int  main()
    
    {
    
        int i,j,p;
    
        printf("初始化数据序列为:
    ");
    
        for(i=0;i<N;i++)
    
            printf("%d ",E[i]);
    
              printf("
    1.无序表查找
    ");
    
        printf("
    输入要查找的关键码: ");
    
        scanf("%d",&i);
    
        if((j=search1(E,N,i))>=0)
    
            printf("找到关键字,位置:%d
    ",j+1);
    
        else
    
            printf("找不到!
    ");
    
            getch();
    
     
    
     
    
        printf("
    顺序排序后的数据序列为:
    ");
    
          s_sort(E,N);
    
        for(i=0;i<N;i++)
    
            printf("%d ",E[i]);
    
              printf("
    2.有序表查找
    ");
    
        printf("
    
    输入要查找的关键字:");
    
        scanf("%d",&i);
    
        if((j=search2(E,N,i))>=0)
    
            printf("找到关键字,位置为:%d
    ",j+1);
    
        else
    
            printf("找不到!
    ");
    
            getch();
    
     
    
            printf("
    3.二分法查找
    ");
    
        printf("
    输入要查找的关键字:");
    
        scanf("%d",&i);
    
        if((j=bin_search(E,N,i))>=0)
    
            printf("找到关键字,位置为:%d
    ",j+1);
    
        else
    
            printf("找不到
    ");
    
        getch();
    
    }

    (二)提高题

    (1)画出数据结构基本运算的流程图

    (2)程序运行主要结果截图

    (3)程序源代码

    #include<stdio.h>
    
    #include<stdlib.h>
    
    #define MAXQ 5
    
    typedef struct workload
    
    {
    
        int no;
    
        int q;
    
        struct workload *next;
    
    }WL;
    
    void Getdata(int maxno,int *no,int *q)
    
    {
    
     
    
        *no=rand()%maxno;
    
        *q=rand()%MAXQ+1;
    
    }
    
    WL *creat_wl(int maxno,int maxrc)
    
    {
    
        int no,q,i;
    
        WL *u,*v,*p,*head;
    
        head=NULL;
    
        for(i=0;i<maxrc;i++)
    
        {
    
            Getdata(maxno,&no,&q);
    
            printf("[%4d]%4d",no,q);
    
            for(v=head;v!=NULL&&v->no!=no;v=v->next)
    
                u=v;
    
            if(v!=NULL)
    
            {
    
                if(v==head)
    
                    head=v->next;
    
                else
    
                    u->next=v->next;
    
                v->q+=q;
    
            }
    
            else
    
            {
    
                if((v=(WL*)malloc(sizeof(WL)))==NULL)
    
                {
    
                    printf("申请空间失败!");
    
                    exit(-1);
    
                }
    
                v->no=no;
    
                v->q=q;
    
            }
    
            p=head;
    
            while(p!=NULL&&(p->q<v->q||p->q==v->q&&p->no>no))
    
            {
    
                u=p;
    
                p=p->next;
    
            }
    
            if(p==head)
    
                head=v;
    
            else
    
                u->next=v;
    
            v->next=p;
    
        }
    
        return head;
    
    }
    
    void print_wl(WL *head)
    
    {
    
        int count,order;
    
        WL *u,*v;
    
        printf("order quantity count number
    ");
    
        u=head;
    
        order=1;
    
        while(u!=NULL)
    
        {
    
            for(count=1,v=u->next;v!=NULL&&v->q==u->q;v=v->next)
    
                count++;
    
            printf("%4d%9d%6d",order,u->q,count);
    
            order+=count;
    
            for( ;count--!=0;u=u->next)
    
                printf("%4d",u->no);
    
            printf("
    ");
    
        }
    
    }
    
    int main()
    
    {
    
        WL *wl,*tmp;
    
        int i,j;
    
        while(1)
    
        {
    
            printf("输入人工数(<1000,>0),工作量记录数(<10000,>0),<=0退出
    ");
    
            fflush(stdin);
    
            scanf("%d %d",&i,&j);
    
            if(i<=0||j<=0)
    
                return 0;
    
            if(i>=1000||j>=10000)
    
                continue;
    
            wl=creat_wl(i,j);
    
            print_wl(wl);
    
            while(wl!=NULL){
    
                tmp=wl->next;
    
            free(wl);
    
            wl=tmp;
    
            }
    
        }
    
    }
    
     
  • 相关阅读:
    Nginx安装详细指南
    git 常用命令
    oracle server config
    CentOS6.5下安装oracle11gR2
    oracle query
    oracle function
    oracle note
    正则表达
    DOM&BOM的起源、方法、内容、应用
    sticky
  • 原文地址:https://www.cnblogs.com/hakim-laohu/p/6639106.html
Copyright © 2011-2022 走看看