算法与数据结构--在顺序线性表L中查找第1个值与e满足compare()的元素的为序--算法2.5

算法与数据结构--在顺序线性表L中查找第1个值与e满足compare()的元素的为序--算法2.5

分类: 算法与数据结构 C++语言学习   1336人阅读  评论(0)  收藏  举报
算法 数据结构 存储 list input struct
[cpp]  view plain copy
  1. /* (程序头部注释开始) 
  2. * 程序的版权和版本声明部分 
  3. * Copyright (c) 2011, 烟台大学计算机学院学生  
  4. * All rights reserved. 
  5. * 文件名称:在顺序线性表L中查找第1个值与e满足compare()的元素的为序 
  6.  
  7.   * 作 者: 雷恒鑫  
  8.   * 完成日期: 2012 年 09 月 18 日 
  9.   * 版 本 号: V1.0  
  10.   * 对任务及求解方法的描述部分 
  11.   * 输入描述:   在顺序线性表L中查找第1个值与e满足compare()的元素的为序 
  12.                 若找到,则返回其在L中的位序,否则返回0 
  13.   * 问题描述: 
  14.   * 程序输出: 
  15.    
  16.   * 程序头部的注释结束 
  17.      
  18. */  
  19.   
  20. #include <iostream>  
  21.   
  22. using namespace std;  
  23.   
  24. #define LIST_INIT_SIZE    100   //线性表存储空间的初始分配量  
  25.   
  26. #define LISTINCREMENT   10  //线性表存储空间的分配增量  
  27.   
  28. typedef int ElemType;      //定义别名  
  29.   
  30. typedef int Status;      //定义别名  
  31.   
  32. typedef struct{  
  33.     ElemType *elem;     //存储空间基址  
  34.     int length;     //当前长度  
  35.     int listsize;       //当前分配的存储容量(以sizeof(ElemType)为单位)  
  36. }SqList;  
  37.   
  38.   
  39. Status InitList_Sq(SqList &L){  
  40.     //构造一个空的线性表L  
  41.     L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));  
  42.     if(!L.elem)  
  43.         exit(1);        //存储分配失败  
  44.     L.length = 0;       //空表长度为0  
  45.     L.listsize = LIST_INIT_SIZE;        //初始存储容量  
  46.     return true;  
  47. }  
  48.   
  49. Status ListInsert_Sq(SqList &L,int i,ElemType e)  
  50. {  
  51.     //在顺序线性表L中第i个位置之前插入新的元素e  
  52.     //i的合法值为1<=i<=ListLength_Sq(L)+1  
  53.     if(i <1 || i> L.length + 1)  
  54.         return false;   //i值不合法  
  55.     if(L.length >= L.listsize)   //当前存储空间已满,增加分配  
  56.     {  
  57.         ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT )* sizeof(ElemType));  
  58.         if(!newbase)  
  59.             exit(1);    //存储分配失败  
  60.         L.elem = newbase;//新基址  
  61.         L.listsize += LISTINCREMENT;    //增加存储容量  
  62.     }  
  63.       
  64.     ElemType *q = &(L.elem[i-1]);//q为插入位置  
  65.       
  66.     for(ElemType *p = &(L.elem[L.length-1]);p>=q;--p)  
  67.         *(p+1) = *p;    //插入位置及之后的元素右移  
  68.       
  69.     *q = e;     //插入e  
  70.     ++L.length;     //表长增1  
  71.     return true;  
  72. }  
  73.   
  74. Status ListDelete_Sq(SqList &L,int i)  
  75. {  
  76.     //在顺序线性表L中删除第i个元素,并用e返回其值  
  77.     //i的合法值为 1<= i<=ListLength_Sq(L)  
  78.     if((i<1)||(i>L.length))  
  79.         return false;   //i值不合法  
  80.     ElemType *p = &(L.elem[i-1]);   //p为被删除元素的位置  
  81.     ElemType e = *p;    //被删除元素的值赋值给e  
  82.     ElemType *q = L.elem + L.length-1;  //表尾元素的位置  
  83.     for(++p;p<=q;++p)      
  84.         *(p-1) = *p;    //被删除元素之后的元素左移  
  85.     --L.length; //表长减1  
  86.     return e;  
  87. }  
  88.   
  89.   
  90. Status compare(ElemType e1,ElemType e2)  
  91. {  
  92.     if(e1==e2)  
  93.         return true;  
  94.     return false;  
  95.   
  96. }  
  97.   
  98. int LocateElem_sq(SqList L,ElemType e,Status (*compare)(ElemType,ElemType))  
  99. {  
  100.     //在顺序线性表L中查找第1个值与e满足compare()的元素的为序  
  101.     //若找到,则返回其在L中的位序,否则返回0  
  102.     int i = 1;//i的初值为第1个元素的位序  
  103.     ElemType *p = L.elem;       //p的初值为为第1个元素的存储位置  
  104.     while(i<=L.length &&!(*compare)(*p++,e))  
  105.     {  
  106.         ++i;  
  107.     }  
  108.     if(i<=L.length)  
  109.     {  
  110.         return i;  
  111.     }  
  112.     else   
  113.     {  
  114.         return 0;  
  115.     }  
  116. }  
  117.   
  118. void input(SqList L)  
  119. {  
  120.     int i = 1;//i的初值为第1个元素的位序  
  121.     ElemType *p = L.elem;       //p的初值为为第1个元素的存储位置  
  122.     while(i<=L.length)  
  123.     {  
  124.         cout<<*(p++)<<"    ";  
  125.         ++i;  
  126.     }  
  127.     cout<<endl;  
  128. }  
  129.   
  130. void main()  
  131. {  
  132.     SqList L;  
  133.     InitList_Sq(L);  
  134.     ListInsert_Sq(L,1,2);//在顺序线性表L中第i个位置之前插入新的元素e  
  135.     ListInsert_Sq(L,2,3);//在顺序线性表L中第i个位置之前插入新的元素e  
  136.     ListInsert_Sq(L,3,4);//在顺序线性表L中第i个位置之前插入新的元素e  
  137.     ListInsert_Sq(L,4,5);//在顺序线性表L中第i个位置之前插入新的元素e  
  138.     //ElemType e = ListDelete_Sq(L,1);  
  139.     cout<<"线性表中的所有元素为:";  
  140.     input(L);  
  141.     int e = LocateElem_sq(L,3,(*compare));//在顺序线性表L中查找第1个值与e满足compare()的元素的为序  
  142.     cout<<"线性表中与3相等的元素的位序为:"<<e<<endl;  
  143.     system("PAUSE");  
  144.     return;  
  145. }  


运行结果:

算法与数据结构--在顺序线性表L中查找第1个值与e满足compare()的元素的为序--算法2.5_第1张图片

你可能感兴趣的:(算法与数据结构,C++语言学习)