數據結構實驗報告-實驗五 查找


實驗五   查找

 

實驗目的

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("初始化數據序列為:\n");

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

          printf("\n1.無序表查找\n");

    printf("\n輸入要查找的關鍵碼: ");

    scanf("%d",&i);

    if((j=search1(E,N,i))>=0)

        printf("找到關鍵字,位置:%d\n",j+1);

    else

        printf("找不到!\n");

        getch();

 

 

    printf("\n順序排序后的數據序列為:\n");

      s_sort(E,N);

    for(i=0;i<N;i++)

        printf("%d ",E[i]);

          printf("\n2.有序表查找\n");

    printf("\n\n輸入要查找的關鍵字:");

    scanf("%d",&i);

    if((j=search2(E,N,i))>=0)

        printf("找到關鍵字,位置為:%d\n",j+1);

    else

        printf("找不到!\n");

        getch();

 

        printf("\n3.二分法查找\n");

    printf("\n輸入要查找的關鍵字:");

    scanf("%d",&i);

    if((j=bin_search(E,N,i))>=0)

        printf("找到關鍵字,位置為:%d\n",j+1);

    else

        printf("找不到\n");

    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\n");

    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("\n");

    }

}

int main()

{

    WL *wl,*tmp;

    int i,j;

    while(1)

    {

        printf("輸入人工數(<1000,>0),工作量記錄數(<10000,>0),<=0退出\n");

        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;

        }

    }

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM