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

问题及代码

list.h

/*  
*Copyright (c) 2015,烟台大学计算机学院  
*All rights reserved.  
*文件名称:test.cpp  
*作者:王敏 
*完成日期:2015年09月17日  
*版本号:v1.0  
*  
*问题描述:删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
*输入描述:  
*程序输出:  未删除之前的所有元素,删除[x,y]值范围内的数后的所有元素
*/   

#include <stdio.h>
#include <malloc.h>

#define MaxSize 50
typedef int ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int length;
} SqList;

void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表   
void DispList(SqList *L);//输出线性表DispList(L)   
bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)   
int  ListLength(SqList *L); //求线性表的长度ListLength(L)   
bool GetElem(SqList *L,int i,ElemType &e); //求某个数据元素值GetElem(L,i,e)   
int  LocateElem(SqList *L, ElemType e); //按元素值查找LocateElem(L,e)   
void InitList(SqList *&L);//初始化线性表InitList(L)   
bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)      
bool ListDelete(SqList *&L,int i,ElemType e); //删除数据元素ListDelete(L,i,e)   
void DestroyList(SqList *&L);//销毁线性表DestroyList(L)  
void delx2y(SqList *&L, ElemType x,  ElemType y);


list.cpp

#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;
}


//判定是否为空表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
}

//销毁线性表DestroyList(L)   
void DestroyList(SqList *&L) 
{ 
   free(L); 
   printf("线性表被释放!表长度:%d\n", L->length);
} 


//删除线性表中,元素值在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.cpp

#include"list.h"
//用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;
}



 

运行结果

第三周项目4-顺序表应用(1)_第1张图片

学习心得

在这一个项目当中用到了之前建立的算法库,省去了不少的时间。写程序的过程就是一种思想的形成,这次项目的完成还是建立在课本例题的基础之上,还需努力!

 

你可能感兴趣的:(第三周项目4-顺序表应用(1))