第三周 顺序表的应用

来源:互联网 发布:博思通软件 编辑:程序博客网 时间:2024/06/06 13:22
  1. *Copyright (c) 2017, 烟台大学计算机学院 
  2.  *All rights reserved. 
  •  *文件名称:渣.cpp 
  •  *作    者:张行 
  •  *完成日期:2017年9月14日 
  •  *版 本 号:v1.0 
  •  * 
  •  *问题描述:1、删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1); 
                           2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
  •    结果显示:删除前 5 8 7 0 2 4 9 6 7 3
                        删除后 8 0 2 9 3
  • main.cpp
  • #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++;
            }
        L->length=k;
    }//用main写测试代码
    int main()
    {
        SqList *sq;
        ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
        CreateList(sq, a, 10);
        printf("删除前 ");
        DispList(sq);
      delx2y(sq, 4, 7);
    printf("删除后 ");
        DispList(sq);
        return 0;
    }
  • list.cpp
  • #include <stdio.h>  
    #include <malloc.h>  
    #include "list.h"  
    //用数组创建线性表  
    void CreateList(SqList *&L, ElemType a[], int n)  
    {  
        int i;  
        L=(SqList *)malloc(sizeof(SqList));<span style="color:#ff0000;">//注意c语言的开辟动态内存的格式</span>  
        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)  
    {  
        free(L);<span style="color:#ff0000;">//值得借鉴的</span>  
    }  
      
    //判定是否为空表ListEmpty(L)  
    bool ListEmpty(SqList *L)  
    {  
        return(L->length==0);<span style="color:#ff0000;">//为空时返回1</span>  
    }  
      
    //求线性表的长度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)<span style="color:#ff6666;">//引用,e</span>  
    {  
        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  



                list.h

    #ifndef LIST_H_INCLUDED  
    #define LIST_H_INCLUDED  
      
    #define MaxSize 50  
    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);//删