第三周 【项目4- 顺序表应用】

来源:互联网 发布:淘宝网廷长收货 编辑:程序博客网 时间:2024/06/08 16:53
/*  

*Copyright  (c)2017,烟台大学计算机与控制工程学院      

*All rights reservrd.            

*作者:赵楷文 

*完成时间:2017年11月09日      

*版本号:v1.0      

*问题描述:定义一个采用顺序结构存储的线性表,设计算法完成下面的工作: 
1、删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1); 
2、将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。


一、list.h

#ifndef LIST_H_INCLUDED#define LIST_H_INCLUDED#define MaxSize 50typedef 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);//Çóij¸öÊý¾ÝÔªËØÖµ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

二、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));    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);}//Åж¨ÊÇ·ñΪ¿Õ±í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");}//Çóij¸öÊý¾ÝÔªËØÖµ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

1.删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);

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

测试截图:


2.将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。

#include "list.h"#include <stdio.h>//移动结束后,奇数居左,偶数居右void move(SqList *&L){    int i=0,j=L->length-1;    ElemType tmp;    while (i<j)    {        while ((i<j) && (L->data[j]%2==0))  //从右往左,找到第一个奇数(偶数就忽略不管)            j--;        while ((i<j) && (L->data[i]%2==1))  //从左往右,找到第一个偶数(奇数就忽略不管)            i++;        if (i<j)   //如果未到达“分界线”,将右边的奇数和左边的偶数交换        {            tmp=L->data[i];            L->data[i]=L->data[j];            L->data[j]=tmp;        }    }   //待循环上去后,继续查找,并在必要时交换}//用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);    move(sq);    printf("操作后 ");    DispList(sq);    return 0;}

测试截图:


原创粉丝点击