数据实验九 检索

来源:互联网 发布:解压缩软件美化版 编辑:程序博客网 时间:2024/04/19 20:24

头文件一

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAX 500000int readData(int a[],int n,char *f ){    FILE *fp;    int i;    fp=fopen(f,"r");    if(fp==NULL)        return 0;    else    {        for(i=0;i<n&&!feof(fp);i++)            fscanf(fp,"%d",&a[i]);        fclose(fp);        return i;    }}void saveData(int a[],int n,char *f ){    FILE *fp;    fp=fopen(f,"w");    if(fp==NULL)        printf("文件建立失败!");    else    {        for(int i=0;i<n;i++)        {            if(i%10==0)                fprintf(fp,"%c",'\n');            fprintf(fp,"%8d",a[i]);        }        fclose(fp);    }}void output(int a[],int n){    printf("\n数组的内容是:\n");    for(int i=0; i<n; i++)    {        if(i%10==0)            puts("");        printf("%7d",a[i]);    }    puts("");}


基于数组查询

//数组查找#include"ArrayIo.h"#define N 10000int a[N],num;int seqsearch(int key){    int ans=-1;    for(int i=0;i<num;i++){        if(a[i]==key){            ans=i;            break;        }    }    return ans;}int main(){    int x,pos;    num=readData(a,N,"data1.txt");    printf("请输入要查找的整数:\n");    scanf("%d",&x);    pos=seqsearch(x);    if(pos==-1)        printf("查找失败");    else        printf("a[%d]=%d\n",pos,x);    return 0;}


头文件二

#include <stdio.h>#include <stdlib.h>/**************************************//* 链表实现的头文件,文件名slnklist.h *//**************************************/typedef int datatype;typedef struct link_node{    datatype info;    struct link_node *next;} node;typedef node *linklist;/******************************************//*函数名称:creatbystack()          *//*函数功能:头插法建立带头结点的单链表    *//******************************************/linklist creatbystack(){    linklist head,s;    datatype x;    head=(linklist)malloc(sizeof(node));    head->next=NULL;    printf("请输入整数序列(空格分开,以0结束):\n");    scanf("%d",&x);    while(x!=0)    {        s=(linklist)malloc(sizeof(node));        s->info=x;        s->next=head->next;        head->next=s;        scanf("%d",&x);    }    return head;}/***************************************//*函数名称:creatbyqueue()    *//*函数功能:尾插法建立带头结点的单链表 *//***************************************/linklist creatbyqueue(){    linklist head,r,s;    datatype x;    head=r=(linklist)malloc(sizeof(node));    head->next=NULL;    printf("请输入整数序列(空格分开,以0结束):\n");    scanf("%d",&x);    while(x!=0)    {        s=(linklist)malloc(sizeof(node));        s->info=x;        r->next=s;        r=s;        scanf("%d",&x);    }    r->next=NULL;    return head;}/**********************************//*函数名称:print()  *//*函数功能:输出带头结点的单链表      *//**********************************/void print(linklist head){    linklist p;    int i=0;    p=head->next;    printf("List is:\n");    while(p)    {        printf("%7d",p->info);        i++;        if(i%10==0)            puts("");        p=p->next;    }    puts("");}/******************************************//*函数名称:creatLink()       *//*函数功能:从文件中读入n个数据构成单链表 *//******************************************/linklist creatLink(char *f, int n){    FILE *fp;    linklist s,head,r;    head=r=(linklist)malloc(sizeof(node));    head->next=NULL;    fp=fopen(f,"r");    if(fp==NULL)        return head;    else    {        for(int i=0;i<n;i++)        {            s=(linklist)malloc(sizeof(node));            fscanf(fp,"%d",&(s->info));            r->next=s;            r=s;        }        r->next=NULL;        fclose(fp);        return head;    }}/**********************************//*函数名称:delList()  *//*函数功能:释放带头结点的单链表      *//**********************************/void delList(linklist head){    linklist p=head;    while(p)    {        head=p->next;        free(p);        p=head;    }}


基于链表查询

#include"slnklist.h"#define N 100linklist seqsearch(linklist head,int key){    linklist p=head->next;    while(p&&p->info!=key)        p=p->next;    return p;}int main(){    int x;    linklist head,pos;    head=creatLink("data1.txt",N);    print(head);    printf("请输入要查找的整数:");    scanf("%d",&x);    pos=seqsearch(head,x);    if(pos==NULL)        printf("查找失败!\n");    else        printf("查找成功!%d\n",pos->info);    delList(head);}


有序数组二分查找

/*二分查找算法*/#include"ArrayIo.h"#define N 200int binSearch(int a[],int n,int key){    int pos=-1;    int left=0,right=n-1;    int mid=(left+right)>>1;    while(left<right)    {        if(key>a[mid])            left=mid+1;        else            right=mid;        mid=(left+right)>>1;    }    if(a[mid]==key)        pos=mid;    return pos;}int main(){    int a[N],n,x,pos;    n=readData(a,N,"data2.txt");    printf("请输入要查找的整数:");    scanf("%d",&x);    pos=binSearch(a,n,x);    if(pos==-1)        printf("查找失败");    else        printf("a[%d]=%d\n",pos,x);    return 0;}


二分查找

/*基于数组的二分查找递归算法*/#include "ArrayIo.h"#define N 10000int binSearch(int a[],int low,int high,int key){    int ans;    int mid=(low+high)>>1;    if(low>high)        return -1;    if(a[mid]==key)        return mid;    if(key>a[mid])        return binSearch(a,mid+1,high,key);    return binSearch(a,low,mid,key);}int main(){    int a[N],n,x,pos;    n=readData(a,N,"data2.txt");    printf("请输入要查找的整数:");    scanf("%d",&x);    pos=binSearch(a,0,n-1,x);    if(pos==-1)        printf("查找失败");    else        printf("a[%d]=%d\n",pos,x);    return 0;}


头文件三

/**************************************//*         二叉排序树用的头文件       *//*          文件名:bstree.h          *//**************************************/#include<stdio.h>#include<stdlib.h>typedef struct node{    int key;    struct node1 *lchild,*rchild;} bsnode;typedef bsnode *bstree;/*---中序遍历二叉排序树----*/void inorder(bstree t){    if(t)    {        inorder(t->lchild);        printf("%8d",t->key);        inorder(t->rchild);    }}


#include"Arrayio.h"#include"bstree.h"#define N 100/*根据输入的结点序列,建立一棵二叉排序树,并返回根结点的地址*/bstree creatBstree(int a[],int n){                 }int  main(){    int n,a[N];    bstree p,t;        n=readData(a,N,"data1.txt");    output(a,n);        t=creatBstree(a,n);        printf("中序遍历:\n");    inorder(t);    return 0;}



0 0
原创粉丝点击