第3周项目4 顺序表应用(1)


    1. Copyright (c)2015,烟台大学计算机与控制工程学院       
    2. All rights reserved.       
    3. 文件名称:项目4--顺序表应用(1).cpp       
    4. 作    者:陈胜男       
    5. 完成日期:2015年10月11日       
    6. 版 本 号:v1.0       
    7.        
    8. 问题描述:定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:  
    9.             删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);  
    10. 输入描述:若干数据 。     
    11. 程序输出:删除元素后的线性表。 
    12. 程序如下:
    13. list.h
    14. #ifndef LIST_H_INCLUDED
      #define LIST_H_INCLUDED
      
      #define MaxSize 50
      #include <stdio.h>
      #include <malloc.h>
      typedef int ElemType;
      typedef struct
      {
          ElemType data[MaxSize];
          int length;
      } SqList;
      void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表
      void InitList(SqList *&L);//初始化线性表InitList(L)
      void DestroyList(SqList *&L);//销毁线性表DestroyList(L)
      bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
      int ListLength(SqList *L);//求线性表的长度ListLength(L)
      void DispList(SqList *L);//输出线性表DispList(L)
      bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
      int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
      bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)
      bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)#endif // LIST_H_INCLUDED
      #endif
      
    15. list.cpp
    16. #include "list.h"
      //用数组创建线性表
      void CreateList(SqList *&L, ElemType a[], int n)
      {
          int i;
          L=(SqList *)malloc(sizeof(SqList));
          for (i=0; i<n; i++)
              L->data[i]=a[i];
          L->length=n;
      }
      
      //初始化线性表InitList(L)
      void InitList(SqList *&L)   //引用型指针
      {
          L=(SqList *)malloc(sizeof(SqList));
          //分配存放线性表的空间
          L->length=0;
      }
      
      //销毁线性表DestroyList(L)
      void DestroyList(SqList *&L)
      {
          L=(SqList *)malloc(sizeof(SqList));
          free(L);
      }
      
      //判定是否为空表ListEmpty(L)
      bool ListEmpty(SqList *L)
      {
          return(L->length==0);
      }
      
      //求线性表的长度ListLength(L)
      int ListLength(SqList *L)
      {
          return(L->length);
      }
      
      //输出线性表DispList(L)
      void DispList(SqList *L)
      {
          int i;
          if (ListEmpty(L)) return;
          for (i=0; i<L->length; i++)
              printf("%d ",L->data[i]);
          printf("\n");
      }
      
      //求某个数据元素值GetElem(L,i,e)
      bool GetElem(SqList *L,int i,ElemType &e)
      {
          if (i<1 || i>L->length)  return false;
          e=L->data[i-1];
          return true;
      }
      
      //按元素值查找LocateElem(L,e)
      int LocateElem(SqList *L, ElemType e)
      {
          int i=0;
          while (i<L->length && L->data[i]!=e) i++;
          if (i>=L->length)  return 0;
          else  return i+1;
      }
      
      //插入数据元素ListInsert(L,i,e)
      bool ListInsert(SqList *&L,int i,ElemType e)
      {
          int j;
          if (i<1 || i>L->length+1)
              return false;   //参数错误时返回false
          i--;            //将顺序表逻辑序号转化为物理序号
          for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置
              L->data[j]=L->data[j-1];
          L->data[i]=e;           //插入元素e
          L->length++;            //顺序表长度增1
          return true;            //成功插入返回true
      }
      
      //删除数据元素ListDelete(L,i,e)
      bool ListDelete(SqList *&L,int i,ElemType &e)
      {
          int j;
          if (i<1 || i>L->length)  //参数错误时返回false
              return false;
          i--;        //将顺序表逻辑序号转化为物理序号
          e=L->data[i];
          for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
              L->data[j]=L->data[j+1];
          L->length--;              //顺序表长度减1
          return true;              //成功删除返回true
      }
      

      main.cpp
    17.  #include "list.h"
      #include <stdio.h>
      
      //删除线性表中,元素值在x到y之间的元素
      void delx2y(SqList *&L, ElemType x,  ElemType y)
      {
          int k=0,i; //k记录非x的元素个数
          ElemType t;
          if(x>y)//使输出到下面的数都为前面小 后面小的形式
          {
              t=x;
              x=y;
              y=t;
          }
          for (i=0; i<L->length; i++)
              if (L->data[i]<x || L->data[i]>y )  //复制不在[x, y]之间的元素
              {
                  L->data[k]=L->data[i];          //k增加 并且每增加一个新赋值一个
                  k++;
              }
          L->length=k;
      }
      
      //用main写测试代码
      int main()
      {
          SqList *sq;
          ElemType a[12]= {2,0,1,4,5,8,5,0,6,1,1,4};
          CreateList(sq, a, 12);
          printf("删除前 ");
          DispList(sq);
      
          delx2y(sq, 1, 5);//主要运用此函数删除
      
          printf("删除后 ");
          DispList(sq);
          return 0;
      }

      运行结果如下
    18. 知识点总结:删除元素
    19.  
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值