• 必备算法之顺序表相关操作


    首先贴出线性表结构定义

    1 typedef int Position;
    2 typedef struct LNode *List;
    3 struct LNode {
    4     ElementType Data[MAXSIZE];
    5     Position Last; /* 保存线性表中最后一个元素的位置 */
    6 };

    1、创建新表

    1 List MakeEmpty()
    2 {
    3     /*创建并返回一个空的线性表*/
    4     List L;
    5     L = (List) malloc(sizeof(struct LNode));
    6     return L;
    7 }

    2、查找元素

     1 Position Find( List L, ElementType X )
     2 {
     3     //返回线性表中X的位置。若找不到则返回ERROR
     4     int i;
     5     if( !L ){
     6         return ERROR;
     7     }
     8     for( i=0; i<L->Last; i++){
     9         if( L->Data[i] == X){
    10             return i;
    11         }
    12     }
    13     return ERROR;
    14 }

    3、插入元素

     1 bool Insert( List L, ElementType X, Position P )
     2 {
     3     /*X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false; 如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;*/
     4     int i;
     5     if(!L){
     6         return false;
     7     }
     8     if( L->Last==MAXSIZE){
     9         printf("FULL");
    10         return false;
    11     }
    12     if( P<0 || P>L->Last){
    13         printf("ILLEGAL POSITION");
    14         return false;
    15     }
    16     for( i=L->Last; i>P; i--){
    17         L->Data[i] = L->Data[i-1];
    18     }
    19     L->Data[P] = X;
    20     L->Last++;
    21     return true;
    22 }

    4、删除元素

     1 bool Delete( List L, Position P )
     2 {
     3     //将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。
     4     int i;
     5     if( !L ){
     6         return false;
     7     }
     8     if( P>=L->Last || P<0){
     9         printf("POSITION %d EMPTY",P);
    10         return false;
    11     }
    12     for( i=P; i<L->Last; i++){
    13         L->Data[i] = L->Data[i+1];
    14     }
    15     L->Last--;
    16     return true;
    17 }

    5、有序表二分查找(折半查找)

     1 Position BinarySearch( List Tbl, ElementType K )
     2 {
     3     //保证传入的数据是递增有序的。函数BinarySearch要查找K在Tbl中的位置,即数组下标(注意:元素从下标1开始存储)。
     4     //找到则返回下标,否则返回一个特殊的失败标记NotFound。
     5     ElementType left = 1;
     6     ElementType right =Tbl->Last;
     7     ElementType mid;
     8     while( left<=right ){
     9         mid = (left+right)/2;
    10         if( Tbl->Data[mid]>K){
    11             right = mid-1;
    12         }
    13         else if( Tbl->Data[mid]<K ){
    14             left = mid + 1;
    15         }
    16         else{
    17             return mid;
    18         }
    19     }
    20 
    21     return NotFound;
    22 
    23 }
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    后缀数组简要总结
    2019CCPC网络赛
    2019 Multi-University Training Contest 6
    洛谷P4145——上帝造题的七分钟2 / 花神游历各国
    扫描线——POJ1151
    2012Noip提高组Day2 T3 疫情控制
    2012Noip提高组Day1 T3 开车旅行
    JZOJ.5335【NOIP2017模拟8.24】早苗
    三套函数实现应用层做文件监控
    LLVM一个简单的Pass
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8318197.html
Copyright © 2020-2023  润新知