C语言提高-第26/27讲: 实现线性表基本操作的函数/编写查找和排序函数
来源:互联网 发布:linux mint 中文 编辑:程序博客网 时间:2024/05/17 04:32
线性表的基本操作有:删除、插入、合并、查找、修改...
下面根据函数的模块化,给出上述操作及选择排序的函数:
//删除int deleteData(int *p,int len,int loc){ int i=loc; //i从loc开始往前递增 while(i<len-1){ //要删除的第i个及之后的单元有变化 *(p+i)=*(p+i+1); //第i个单元的值为第i+1的 i++; } len--; return len; //返回值为新数组长度}//插入int insertData(int *p,int len,int loc,int v){ int i=len; //i从len开始往前递减 while(i>loc){ //要增加的第i个及之后的单元有变化 *(p+i)=*(p+i-1); //向后移位(倒序腾位) i--; } *(p+i)=v; //修改loc单元的值 len++; return len; //返回值为新数组长度 }//合并int mergeData(int *p1,int l1,int *p2,int l2,int *p3){ int i=0,j=0,k=0; //分别是数组1、数组2,新数组的序号 while(i<l1&&j<l2) //2组数都没有比完 if(*(p1+i)<*(p2+j)){ *(p3+k)=*(p1+i); //把较小的赋到新的数组单元 k++; i++; } else{ *(p3+k)=*(p2+j); k++; j++; } while(i<l1){ //此时数组2里的元素已全部比完 *(p3+k)=*(p1+i); //将未比完的数组1中的元素添加到新数组中 k++; i++; } while(j<l2){ *(p3+k)=*(p2+j); k++; j++; } return k; //返回值为新数组长度}//二分查找int binary_search(int *p,int n,int k){ int i=-1; //i为所查数的序号 int low=0,high=n-1,middle; while(low<=high){ middle=(low+high)/2; if(*(p+middle)==k){ i=middle; break; //找到即跳出循环 } else if(*(p+middle)>k) //k在序号low和middle之间 high=middle-1; else //k在序号middle和high之间 low=middle+1; } return i; //若k存在则i等于middle,否则为-1}//冒泡法排序void bubble_sort(int *p,int n){ int i,j,t; for(i=0;i<n-1;i++){ //比较n-1趟,每一趟确定最后的一个数 for(j=0;j<n-i-1;j++){ //每一趟从第一个开始比到未确定下来的最后一个 if(*(p+j)>*(p+j+1)){//前者大于后者,则交换 t=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=t; } } }}//选择法排序void select_sort(int *p,int n){ int i,j,k,t; //k代表最小元素的下标 for(i=0;i<n-1;i++){ //比较n-1趟,每一趟确定最前的一个数 k=i; //假定每一趟的起始元素最小 for(j=i+1;j<n;j++){ //从未确定的第一项开始比到最后一项 if(*(p+j)<*(p+k)) k=j; //找到该趟中最小元素对应的序号 } t=*(p+i); //将这一趟未排序中的第一个数与最小的数交换 *(p+i)=*(p+k); *(p+k)=t; }}
//在有序数组中插值int insert(int *p,int n,int m){ int i=n-1; //原数组最后一个元素的序号 while(i>=0&&*(p+i)>m){ //把大数往后“搬”,腾出位置保存n *(p+i+1)=*(p+i); i--; } i++; *(p+i)=m; //找到了确定的位置赋值 n++; return n; //返回值为数组中新的有效数据的个数}//删除指定元素(可有重复)int del(int *p,int len,int x){ //删除长度为n的a数组中值为x的元素 int i=0,j=0; //用i和j两个变量 while(i<len){ //由i控制,扫描所有的元素 if(*(p+i)!=x){ //只有当元素值不等于x才往j标识的位置上“搬” *(p+j)=*(p+i); j++; } i++; } return j; //j代表的,就是删除后的元素个数}//删除有序数组中的某个(有重复)的元素int del(int a[],int n,int x){ //删除长度为n的a数组中值为x的元素 int i=0,j; //i代表新数组的序号,j代表原数组的序号 while(a[i]<x&&i<n) //阶段①:先隔过所有小于x的元素,找到要删除元素的位置 i++; j=i; //阶段②:i将标记住这个待删除的位置 while(a[j]==x&&j<n) //j接棒往前走,找到要保留的元素 j++; while(j<n) a[i++]=a[j++]; //阶段③:将要保留的元素,直接“覆盖”到i标记住的位置,逐个赋值,结果就是将等于x的元素删除了 return i; //i代表的,就是删除后的元素个数}
心得:
删除即是将符合条件的元素重新放入一个新的数组
插入即是倒序腾位,在对的位置上赋值
冒泡法排序每一趟确定最后一个值;选择法排序每一趟确定最前一个值(与舞蹈还是有区别的,舞蹈中,每一趟可以交换多次,谁小谁去前面)
阅读全文
1 0
- C语言提高-第26/27讲: 实现线性表基本操作的函数/编写查找和排序函数
- C语言提高-27讲: 编写查找和排序函数(查成绩)
- 第7周 C语言及程序设计提高例程-26 实现线性表基本操作的函数
- C语言及程序设计提高例程-26 实现线性表基本操作的函数
- 第四周《C语言及程序设计》实践项目26 实现线性表基本操作的函数
- 第7周 C语言及程序设计提高例程-27 编写查找和排序函数(有疑问)
- C语言及程序设计提高例程-27 编写查找和排序函数
- C语言提高-第9讲: 函数的嵌套调用(编制sin函数表)
- C语言提高-第8讲: 函数的声明、定义和调用(歌手大奖赛计分函数版)
- C语言:编写查找和排序函数(二分查找,冒泡排序,选择排序法)
- 【C语言】编写函数实现二分查找
- C语言提高-第5讲: 函数的参数(求4数最大公约数)
- C语言提高-第5讲: 函数的参数(回文、素数)
- C语言提高-第7讲: 返回指针的函数(回顾“野指针”)
- C语言提高-30讲:字符和字符串处理函数
- 顺序线性表的基本操作(C语言实现)
- 自己编写c语言实现的字符串操作函数
- C语言线性表的基本操作
- 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。 现在请计算A+B的结果,并以正常形式输出。
- Google 投资 Lyft 背后、AlphaGo Zero 人工智能威胁论?
- 16进制转换方法 Java
- 移动构造函数和移动赋值运算符
- [CodeForces
- C语言提高-第26/27讲: 实现线性表基本操作的函数/编写查找和排序函数
- 拷贝版本(成员)函数与移动版本(成员)函数
- 数据结构与算法分析—栈的数组实现(C语言)
- 小朋友学C语言(11):求1到100的和
- TensorFlow练习5: 训练一个简单的游戏AI(Deep Q Network)
- 经典递归解决汉诺塔!
- php 正则表达式总结及应用
- c++/c的内存管理机制
- UVa11552