软基上机实验报告-查找与排序(拓展题)
实验五-查找和排序实验报告范文查找及排序实验

实验五-查找和排序实验报告范文查找及排序实验-可编辑修改---可编辑修改-实验五查找和排序1、实验目的掌握顺序查找的基本方法掌握简单排序和二分法查找的算法。
2.能运用线性表的查找方法解决实际问题。
2、实验内容1、给出在一个无序表A,采用顺序查找算法查找值为某的元素的算法2、给出一个无序表B,采用简单排序方法使该表递增有序,并采用二分查找算法查找值为某的元素的算法。
3、实验步骤(1)仔细分析实验内容,给出其算法和流程图;(2)用C语言实现该算法;(3)给出测试数据,并分析其结果;(4)在实验报告册上写出实验过程。
4、实验报告要求实验报告要求书写整齐,步骤完整,实验报告格式如下:1、[实验目的]2、[实验设备]3、[实验步骤]4、[实验内容]5、[实验结果(结论)]排序创建二叉捌L「1折半查找算法描述如下:intSearch_Bin(SSTableST,KeyTypekey)low=1;high=ST.length; while(low<=high){mid=(low+high)/2;ifEQ(key,ST.elem[mid].key)returnmid;eleifLT(key,ST.elem[mid].key)high=mid-1;elelow=mid+1;}return0;}//Search_Bin;2.顺序查找算法描述如下:typedeftruct{ElemType某elem;intlength;}SSTable;顺序查找:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,查找不成功。
intSearch_Seq(SSTableST,KeyTypekey){ST.elme[O].key=key;for(i=ST.Iength;!EQ(ST.elem[i].key,key);--i);returni;}(3)写出源程序清单(加适当的注释)。
实验7 查找和排序实验(最后一次实验)

云南大学软件学院实验报告课程:数据结构实验学期:2014-2015学年第一学期任课教师:谢仲文专业:信息安全学号:姓名:成绩:实验7 查找和排序实验(最后一次实验)一、实验目的1.理解有关查找的基本思想以及使用的数据存储结构;2.掌握有关排序的相关算法以及各种算法使用的数据存储结构。
二、实验软硬件环境(CPU、OS、IDE):三、实验任务(要求写出核心代码,并对运行结果截图)对数据序列:{55,13,23,72,109,67,2,78,13}分别实现如下操作:必做:1) 顺序查找;2) 使用直接插入排序或冒泡排序(二选一)、快速排序(必做)对原纪录序列进行排序;3) 对排好序的纪录序列表进行折半查找;4) 利用原纪录序列建立一颗二叉排序树,并在其上实现特定关键字值结点的查找;选做:5) 按照“除留余数法”哈希构造函数和线性探测法的冲突处理方法创建表长为m=11的哈希表;6) 实现5)创建哈希表上的查找。
实验代码:#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define MAX 100typedef int ElemType;typedef struct BTNode //树节点定义{ElemType data;struct BTNode *lchild, *rchild;}BTNode,*BiTree;typedef struct{int key;int flag; //falg=1时表示有关键字,falg=0时表示没有关键字}Elemtype;typedef struct{Elemtype *elem; //动态分配的哈希表的首地址int count; //当前数据元素个数}HashTable;int Sequential_Search(int a[],int n,int key) //顺序查找;{int i=1;a[0]=key; //设置a[0]为关键字值,即哨兵。
软基第五次上机实验报告

软基第五次上机实验报告EX5_1一、程序流程设有序序列的数据元素为: (3, 10, 13, 17, 40, 43, 50, 70)1)编写顺序查找函数2)编写二分查找函数3)在主程序中输入关键字(43和5), 分别调用两种查找函数, 输出结果。
数据结构描述: 二分查找二、程序代码:#include<stdio.h>#include<stdlib.h>#define N 20void search_sequence(int *a,int x){int i;for(i=0;a[i+1]!=0;i++)if (a[i]==x) {printf("Location:%d\n",i);return;}if (a[i+1]==0) printf("Can not find!\n");}void search_dichotomy(int *a,int x){int i=-1,length,head,trail,p;while(a[++i]!=0);length=i;head=0;trail=length-1;while(head<trail){p=(head+trail)/2;if (a[p]<x) head=p+1;else if (a[p]>x) trail=p-1;else {printf("Location:%d\n",p);return;}}printf("Can not find!\n");}void main(){int a[]={3,10,13,17,40,43,50,70,0};printf("顺序查找43和5: \n");search_sequence(&a,43);search_sequence(&a,5);printf("二分查找43和5: \n");search_dichotomy(&a,43);search_dichotomy(&a,5);}三、典型测试数据1: 3, 10, 13, 17, 40, 43, 50, 70四上机时遇到的问题:1、文件头缺失解决办法: 添加#include<stdlib.h>五、实际运行结果:六、个人体会: 在此次实验中让我更深的认识到了顺序查找。
软基上机实验报告-顺序表

一、实验项目名称:ex1_1——基本题:1)首先创建一个顺序表:从键盘读入一组整数(长度小于等于20),按输入顺序放入顺序表,输入以-1结束(注意-1不放到顺序表内);将创建好的顺序表元素依次输出到屏幕上。
2)在已创建好的顺序表中插入一个元素:从键盘读入需插入的元素值和插入位置,调用插入函数完成插入操作;然后将顺序表元素依次输出到屏幕上。
3)在已创建好的顺序表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作;然后将顺序表元素依次输出到屏幕上。
软件技术基础实验table.cpp二、程序代码#include "stdafx.h"#include "mystruct.h"#include "ui.h"/******************************************************************************************* ** Function name: init_table()** Descriptions : 初始化顺序表,顺序表利用数组作为基础,其特点是需要事先获得全部元素空间,因此本函数的主要功能就是向系统申请足够的空间作为顺序表的存储空间。
涉及的系统函数为:malloc()** 此外,良好的习惯是将空间内的各项数据进行适当的初始化** Input: NONE** Output: NONE** return: 类型:table_t *,返回顺序表的结构指针** Created by :** Created Date :**-------------------------------------------------------------------------** Modified by :** Modified Date:**-------------------------------------------------------------------------*******************************************************************************************/ table_t * init_table( ){table_t * t;t=(table_t *)malloc(sizeof(table_t));t->length = 0;return t;}/******************************************************************************************* ** Function name: free_table()** Descriptions : 释放顺序表空间** 当程序结束时会通过本函数来释放通过malloc获得的顺序表空间** Input: table_t * t; 顺序表指针** Output: NONE** return: 类型:void** Created by :** Created Date :**------------------------------------------------------------------------------------------** Modified by :** Modified Date:**------------------------------------------------------------------------------------------*******************************************************************************************/ void free_table(table_t * t){free(t);}/******************************************************************************************* ** Function name: get_table()** Descriptions : 查询顺序表** 查询顺序表中第i个元素** Input:** table_t * table; 顺序表指针** int index; 查询位置,即第i个元素** Output:** element_t * elem; 元素域指针,用来存放被查询到的元素内容,** (注意,需要将元素全部内容拷贝到该指针所记录的空间中,即,使用memcpy())** return: 类型:int,返回查询是否成功,为0表示找到指定元素,为-1表示没有找到,一般是因为** index指示的位置超出了顺序表的范围** Created by :** Created Date :**-------------------------------------------------------------------------** Modified by :** Modified Date:**-------------------------------------------------------------------------*******************************************************************************************/ int get_table(table_t * table,int index, element_t * elem){//判断index是否超出顺序表范围if(index <= 0 || index > table->length){return -1;}//复制元素内容到指定空间中;memcpy(elem,&(table->data[index-1]),sizeof(element_t));//errorreturn 0;}/******************************************************************************************* ** Function name: add_table()** Descriptions : 将指定元素放入到顺序表的末尾** Input:** table_t * table; 顺序表指针** element_t data; 待放入的元素** Output:** table_t * table; 添加新元素后的顺序表指针** return: 类型:int; 为-1表示放入失败,一般是因为顺序表已经放满,为0表示正确放入** Created by :** Created Date :**-------------------------------------------------------------------------** Modified by :** Modified Date:**-------------------------------------------------------------------------*******************************************************************************************/ int add_table(table_t * table, element_t data){table->data[table->length] = data;table->length ++;return 0;}/******************************************************************************************* ** Function name: insert_table()** Descriptions : 将指定元素插入到顺序表的指定位置之前** Input:** table_t * table; 顺序表指针** element_t data; 待放入的元素** int location; 插入位置,语义是:第X个元素前,,当location大于链表元素总数时,该元素** 将插入到表尾。
查找排序实验报告

查找排序实验报告一、实验目的本次实验的主要目的是深入理解和比较不同的查找和排序算法在性能和效率方面的差异。
通过实际编程实现和测试,掌握常见查找排序算法的原理和应用场景,为今后在实际编程中能够选择合适的算法解决问题提供实践经验。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
计算机配置为:处理器_____,内存_____,操作系统_____。
三、实验内容1、查找算法顺序查找二分查找2、排序算法冒泡排序插入排序选择排序快速排序四、算法原理1、顺序查找顺序查找是一种最简单的查找算法。
它从数组的一端开始,依次比较每个元素,直到找到目标元素或者遍历完整个数组。
其时间复杂度为 O(n),在最坏情况下需要遍历整个数组。
2、二分查找二分查找适用于已排序的数组。
它通过不断将数组中间的元素与目标元素进行比较,将查找范围缩小为原来的一半,直到找到目标元素或者确定目标元素不存在。
其时间复杂度为 O(log n),效率较高。
3、冒泡排序冒泡排序通过反复比较相邻的两个元素并交换它们的位置,将最大的元素逐步“浮”到数组的末尾。
每次遍历都能确定一个最大的元素,经过 n-1 次遍历完成排序。
其时间复杂度为 O(n^2)。
4、插入排序插入排序将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的合适位置。
其时间复杂度在最坏情况下为 O(n^2),但在接近有序的情况下性能较好。
5、选择排序选择排序每次从待排序数组中选择最小的元素,与当前位置的元素交换。
经过 n-1 次选择完成排序。
其时间复杂度为 O(n^2)。
6、快速排序快速排序采用分治的思想,选择一个基准元素,将数组分为小于基准和大于基准两部分,然后对这两部分分别递归排序。
其平均时间复杂度为 O(n log n),在大多数情况下性能优异。
五、实验步骤1、算法实现使用Python 语言实现上述六种查找排序算法,并分别封装成函数,以便后续调用和测试。
数据结构实验报告五,查找与排序-

数据结构实验报告五,查找与排序-查找与排序一、实验目的:1.理解掌握查找与排序在计算机中的各种实现方法。
2.学会针对所给问题选用最适合的算法。
3.熟练掌握常用排序算法在顺序表上的实现。
二、实验要求:掌握利用常用的查找排序算法的思想来解决一般问题的方法和技巧,进行算法分析并写出实习报告。
三、实验内容及分析:设计一个学生信息管理系统,学生对象至少要包含:学号、性别、成绩1、成绩总成绩等信息。
要求实现以下功能:1.平均成绩要求自动计算;2.查找:分别给定学生学号、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);3.? 排序:分别按学生的学号、成绩1、成绩2、平均成绩进行排序(要求至少用两种排序算法实现)。
四、程序的调试及运行结果五、程序代码#includestdio.h#includestring.hstruct student//定义结构体{char name;int a1,a2,a3,num;double pow;}zl;int count=0;void jiemian1(); //主界面//函数声明int jiemian2(); //选择界面void luru(); //录入函数void xianshi(); //显示void paixv(); //排序void diaoyong(int); //循环调用选择界面void tianjia(); //添加信息void chaxun1(); //按学号查询详细信息void chaxun2(); //按姓名查询详细信息void xiugai(); //修改信息void shanchu(); //删除信息void main() //main函数{jiemian1();//函数点用}void jiemian1() //主界面定义{char a;printf(“\n\n\n\n\t\t\t学员信息管理器\n\n\n\t\t\t 数据结构课程设计练习六\n\n\n\t\t\t 09信计2:于学彬\n\n“);printf("\n\t\t\t 按回车键继续:");scanf("%c",system("cls");jiemian2();}int jiemian2() //选择界面{int a,b;printf("*******************************主要功能********************************");printf("\n\n\n\n\t\t\t\t1.录入信息\n\n\t\t\t\t2.添加信息\n\n\t\t\t\t3.查看信息\n\n\t\t\t\t4.查询信息\n\n\t\t\t\t5.修改信息\n\n\t\t\t\t6.删除信息\n\n\t\t\t\t7.退出\n\n\t\t\t\t请选择:");scanf("%d",switch(a){case 1:system("cls");luru();break;case 2:system("cls");tianjia();break;case 3:system("cls");paixv();break;case 4:system("cls");printf("1.按学号查询详细信息\n2.按姓名查询详细信息\n请选择:");scanf("%d",switch(b){case 1:system("cls");chaxun1();break;case 2:system("cls");chaxun2();break;} break;case 5:system("cls");xiugai();break;case 6:system("cls");shanchu();break;case 7:system("cls");return a;break;}}void diaoyong(int b) //循环调用选择界面{char a='y';printf("是否返回选择页(y/n):");fflush(stdin);//清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)a=getchar();system("cls");while(a=='y'||a=='Y'){b=jiemian2();if(b==7){break;}}}void luru() //录入函数{char a;//='y';do{printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[count].num);//调用结构体printf("姓名:");fflush(stdin);gets(zl[count].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[count].a1);printf("成绩2:");scanf("%d",zl[count].a2);printf("成绩3:");scanf("%d",zl[count].a3);zl[count].pow=(zl[count].a1+zl[count].a2+zl[count].a3)/3;//求平均数printf("是否继续(y/n):");fflush(stdin);a=getchar();count++;system("cls");}while(a=='y'count100);//paixv();diaoyong(count);}void tianjia() //添加信息{char a='y';do{printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[count].num);printf("姓名:");//fflush(stdin);gets(zl[count].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[count].a1);printf("成绩2:");scanf("%d",zl[count].a2);printf("成绩3:");scanf("%d",zl[count].a3);zl[count].pow=(zl[count].a1+zl[count].a2+zl[count].a3)/3; printf("是否继续(y/n):");//fflush(stdin);a=getchar();count++;system("cls");}while(a=='y'count100);paixv(count);diaoyong(count);}void xianshi() //显示{int i;printf("学号\t \t姓名\t\t\t平均成绩\n");for(i=0;icount;i++){printf("%d\t \t%s\t\t\t%f\n",zl[i].num,zl[i].name,zl[i].pow); }}void paixv() //排序{int i,j;struct student zl1;printf("排序前:\n");xianshi();for(i=0;icount;i++){for(j=1;jcount-i;j++){if(zl[j-1].powzl[j].pow){zl1=zl[j-1];zl[j-1]=zl[j];zl[j]=zl1;}}}printf("排序后:\n");xianshi();diaoyong(count);}void chaxun1() //按学号查询详细信息{int i,num;printf("请输入要查询学员的学号:");scanf("%d",num);printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); for(i=0;icount;i++){if(zl[i].num==num){printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);}}diaoyong(count);}void chaxun2() //按姓名查询详细信息{int i;struct student zl1;printf("请输入要查询学员的姓名:");fflush(stdin);gets();printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");for(i=0;icount;i++){if((strcmp(zl[i].name,))==0)//比较两个字符串的大小{printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);}}diaoyong(count);}void xiugai() //修改信息{int i,num;printf("请输入要查询学员的学号:");scanf("%d",num);printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");for(i=0;icount;i++){if(zl[i].num==num){break;}}printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[i].num);printf("姓名:");fflush(stdin);gets(zl[i].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[i].a1);printf("成绩2:");scanf("%d",zl[i].a2);printf("成绩3:");scanf("%d",zl[i].a3);zl[i].pow=(zl[i].a1+zl[i].a2+zl[i].a3)/3;printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl[i].a3,zl[i].pow);diaoyong(count);}void shanchu() //删除信息{int num,i,j;printf("请输入要删除的学员学号:");scanf("%d",num);for(i=0;icount;i++){if(zl[i].num==num){for(j=i;jcount;j++){zl[j]=zl[j+1];}}}count--;xianshi();diaoyong(count);}。
查找、排序的应用 实验报告

实验七查找、排序的应用一、实验目的1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。
2、学会比较各种排序与查找算法的优劣。
3、学会针对所给问题选用最适合的算法。
4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。
二、实验内容[问题描述]对学生的基本信息进行管理。
[基本要求]设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。
要求实现以下功能:1.总成绩要求自动计算;2.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);3.排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。
[测试数据]由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握哈希表的定义,哈希函数的构造方法。
2、掌握一些常用的查找方法。
1、掌握几种常用的排序方法。
2、掌握直接排序方法。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
五、算法设计a、折半查找设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值。
初始时,令low=1,high=n,mid=(low+high)/2,让key与mid指向的记录比较,若key==r[mid].key,查找成功若key<r[mid].key,则high=mid-1若key>r[mid].key,则low=mid+1重复上述操作,直至low>high时,查找失败b、顺序查找从表的一端开始逐个进行记录的关键字和给定值的比较。
在这里从表尾开始并把下标为0的作为哨兵。
void chaxun(SqList &ST) //查询信息{ cout<<"\n************************"<<endl;cout<<"~ (1)根据学号查询 ~"<<endl;cout<<"~ (2)根据姓名查询 ~"<<endl;cout<<"~ (3)根据性别查询 ~"<<endl;cout<<"~ (4)退出 ~"<<endl;cout<<"************************"<<endl; if(m==1) 折半查找算法:for(int i=1;i<ST.length;i++)//使学号变为有序for(int j=i;j>=1;j--)if(ST.r[j].xuehao<ST.r[j-1].xuehao){LI=ST.r[j];ST.r[j]=ST.r[j-1];ST.r[j-1]=LI;}int a=0;cout<<"输入要查找的学号"<<endl;cin>>n;int low,high,mid;low=0;high=ST.length-1; // 置区间初值while (low<=high){mid=(low+high)/2;if(n==ST.r[mid].xuehao){cout<<ST.r[mid].xuehao<<""<<ST.r[mid].xingming<<""<<ST.r[mid].xingbei<<""<<ST.r[mid].chengji1<<""<<ST.r[mid].chengji2<<""<<ST.r[mid].zong<<endl;a=1;break;}else if(n<ST.r[mid].xuehao )high=mid-1; // 继续在前半区间进行查找elselow=mid+1; // 继续在后半区间进行查找顺序查找算法:cout<<"输入要查找的姓名"<<endl;cin>>name;for(int i=0;i<ST.length;i++){if(name==ST.r[i].xingming){cout<<ST.r[i].xuehao<<""<<ST.r[i].xingming<<""<<ST.r[i].xingbei<<""<<ST.r[i].chengji1<<""<<ST.r[i].chengji2<<""<<ST.r[i].zong<<endl;a=1;}1、插入排序每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。
查找与排序实验报告

实验四:查找与排序【实验目的】1.掌握顺序查找算法的实现。
2.掌握折半查找算法的实现。
【实验内容】1.编写顺序查找程序,对以下数据查找37所在的位置。
5,13,19,21,37,56,64,75,80,88,922.编写折半查找程序,对以下数据查找37所在的位置。
5,13,19,21,37,56,64,75,80,88,92【实验步骤】1.打开VC++。
2.建立工程:点File->New,选Project标签,在列表中选Win32 ConsoleApplication,再在右边的框里为工程起好名字,选好路径,点OK->finish。
至此工程建立完毕。
3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ SourceFile。
给文件起好名字,选好路径,点OK。
至此一个源文件就被添加到了你刚创建的工程之中。
4.写好代码5.编译->链接->调试#include "stdio.h"#include "malloc.h"#define OVERFLOW -1#define OK 1#define MAXNUM 100typedef int Elemtype;typedef int Status;typedef struct{Elemtype *elem;int length;}SSTable;Status InitList(SSTable &ST ){int i,n;ST.elem = (Elemtype*) malloc (MAXNUM*sizeof (Elemtype)); if (!ST.elem) return(OVERFLOW);printf("输入元素个数和各元素的值:");scanf("%d\n",&n);for(i=1;i<=n;i++){scanf("%d",&ST.elem[i]);}ST.length = n;return OK;}int Seq_Search(SSTable ST,Elemtype key){int i;ST.elem[0]=key;for(i=ST.length;ST.elem[i]!=key;--i);return i;}int BinarySearch(SSTable ST,Elemtype key){int low,high,mid;low=1;high=ST.length;while(low<=high){mid=(low+high)/2;if(ST.elem[mid]==key)return mid;else if(key<ST.elem[mid])high=mid-1;elselow=mid+1;}return 0;}void main(){int key;SSTable ST;InitList(ST);printf("输入查找的元素的值:");scanf("%d",&key);Seq_Search(ST,key);printf("查找的元素所在的位置:%d\n",Seq_Search(ST,key));printf("输入查找的元素的值:");scanf("%d",&key);BinarySearch(ST,key);printf("查找的元素所在的位置:%d\n",BinarySearch(ST,key));}【实验心得】这是本学期的最后一节实验课,实验的内容是查找与排序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四、程序流程说明ex5_2:Hash查找——扩展题1)一个班有30位同学,安排装进一个有30个元素的数组,以姓名作为关键字进行哈希存储,具体方法如下:将姓名字符串中的每个字节按ASCII码(中文也支持的哦)加起来,除以30,取得的余数作为元素存放位置(数组下标)。
冲突解决采用线性探查法。
2)输入少于30个学生姓名,按Hash方式存入表中。
3)验证能够按Hash方式找到表中学生,不在表中将提示错误ex5_3:排序——基本题1)编写简单选择法函数2)编写直接插入法函数3)编写冒泡法排序函数4)在主程序中输入一组数据元素,如513,87,512,61,908,170,897,275,653,462,分别调用三种排序函数,输出每趟排序结果。
ex5-4:排序——扩展题编写快速排序函数五、实验程序代码:Ex.2#include<stdio.h>#include<string.h>struct student{char name[20];};struct student s[30];int hash(char *cp)//哈希查找{int sum=0;int n,k;char *q;q=cp;int i;n=strlen(cp);for(i=0;i<n;i++){sum+=(*cp);cp++;}k=sum%30;while(s[k].name[0]!='\0'&&strcmp(s[k].name,q)!=0) {k=(k+1)%30;}if(s[k].name[0]!='\0'){printf("searching success\n");}elseprintf("searching failed\n");return 0;}void hash_save()//哈希表的建立{int i=0,n,sum=0;int k;char name[20];char *p;printf("input the number of the names:\t");scanf("%d",&n);while(n--){printf("input the name:");scanf("%s",name);p=name;k=strlen(p);for(i=0;i<k;i++){sum+=(*p);p++;}k=sum%30;while(s[k].name[0]!='\0'){k=(k+1)%30;}i=0;while(name[i]!='\0'){s[k].name[i]=name[i];i++;}}}main(){void hash_save();int hash(char *cp);hash_save();char name[20];printf("input one name to search:\t");scanf("%s",name);hash(name);printf("input the another name to search:\t");scanf("%s",name);hash(name);}Ex.3#include<stdio.h>#define N 10void selectsort(int s[])//简单选择排序{int i,j,k,small;int swap;for(i=0;i<N-1;i++){small=i;for(j=i+1;j<N;j++){if(s[j]<s[small])small=j;}if(small!=i){swap=s[i];s[i]=s[small];s[small]=swap;}printf("第%d趟:\t",i+1);for(k=0;k<N;k++){printf("%d ",s[k]);}printf("\n");}}void insertsort(int s[])//简单插入排序{int i,j,k;int a;for(i=0;i<N-1;i++){a=s[i+1];j=i;while(j>-1&&a<s[j]){s[j+1]=s[j];j--;}s[j+1]=a;printf("第%d趟:\t",i+1);for(k=0;k<N;k++){printf("%d ",s[k]);}printf("\n");}}void bubblesort(int s[])//冒泡排序{int i,j,k;int swap;for(i=0;i<N-1;i++){for(j=0;j<N-1-i;j++)if(s[j]>s[j+1]){swap=s[j];s[j]=s[j+1];s[j+1]=swap;}}printf("第%d趟:\t",i+1);for(k=0;k<N;k++){printf("%d ",s[k]);}printf("\n");}}main(){void selectsort(int s[]);void insertsort(int s[]);void bubblesort(int s[]);int s1[N]={513,87,512,61,908,170,897,275,653,462};int s2[N]={513,87,512,61,908,170,897,275,653,462};int s3[N]={513,87,512,61,908,170,897,275,653,462};printf("\n简单选择排序:\n");selectsort(s1);printf("\n简单插入排序:\n");insertsort(s2);printf("\n简单冒泡排序:\n");bubblesort(s3);}Ex.3#include<stdio.h>#define N 10void selectsort(int s[])//简单选择排序{int i,j,k,small;int swap;for(i=0;i<N-1;i++){small=i;for(j=i+1;j<N;j++){if(s[j]<s[small])small=j;if(small!=i){swap=s[i];s[i]=s[small];s[small]=swap;}printf("第%d趟:\t",i+1);for(k=0;k<N;k++){printf("%d ",s[k]);}printf("\n");}}void insertsort(int s[])//简单插入排序{int i,j,k;int a;for(i=0;i<N-1;i++){a=s[i+1];j=i;while(j>-1&&a<s[j]){s[j+1]=s[j];j--;}s[j+1]=a;printf("第%d趟:\t",i+1);for(k=0;k<N;k++){printf("%d ",s[k]);}printf("\n");}}void bubblesort(int s[])//冒泡排序{int i,j,k;int swap;for(i=0;i<N-1;i++){for(j=0;j<N-1-i;j++){if(s[j]>s[j+1]){swap=s[j];s[j]=s[j+1];s[j+1]=swap;}}printf("第%d趟:\t",i+1);for(k=0;k<N;k++){printf("%d ",s[k]);}printf("\n");}}main(){void selectsort(int s[]);void insertsort(int s[]);void bubblesort(int s[]);int s1[N]={513,87,512,61,908,170,897,275,653,462};int s2[N]={513,87,512,61,908,170,897,275,653,462};int s3[N]={513,87,512,61,908,170,897,275,653,462};printf("\n简单选择排序:\n");selectsort(s1);printf("\n简单插入排序:\n");insertsort(s2);printf("\n简单冒泡排序:\n");bubblesort(s3);}Ex.4void quicksort(int s[],int l,int r){int i,j;int swap;i=l;j=r;swap=s[l];while(i<j){while(i<j&&swap<=s[j]){j--;}if(i<j){s[i]=s[j];i++;}while(i<j&&swap>=s[i])i++;if(i<j){s[j]=s[i];j--;}}s[i]=swap;if(l<i) quicksort(s,l,i-1);if(i<r) quicksort(s,j+1,r); }六、测试数据:如图七、实际输出:如图Ex2:Ex3:八,上机问题:(1)在哈希表建立的时候,在编写输入循环函数时,条件为while(n>0), 却不能按照所想的输入名字。
解决问题:将while(n>0)改为while(n--),即添加一个循环条件,使程序能在输入一个名字后输入下一个名字。
(2)在冒泡函数编写的时候,第二趟没有引入临时变量,导致后面的数与第一个完全相同。
解决办法:引入临时变量swap,swap=s[j];s[j]=s[j+1];s[j+1]=swap;九、体会查找运算依赖于查找表中各数据元素在计算机存储系统的组织与存储结构。