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
原创粉丝点击