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

/*
*Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:项目4.cbp
*作    者:毕梦楠
*完成日期:2015年9月25日
*版 本 号:v1.0
*
*问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
*输入描述:无
*程序输出:输出调整后的线性表
*/         


 

  • 头文件list.h代码:
#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
  • 功能函数文件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;
}

//销毁线性表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
}


第3周项目4-顺序表应用问题(2)

分类: 项目 23人阅读 评论(0) 收藏 举报

问题:

  1. /* 
  2. *Copyright (c)2015,烟台大学计算机与控制工程学院 
  3. *All rights reserved. 
  4. *文件名称:项目4.cbp 
  5. *作    者:王聪 
  6. *完成日期:2015年9月19日 
  7. *版 本 号:v1.0 
  8. * 
  9. *问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。 
  10. *输入描述:无 
  11. *程序输出:输出调整后的线性表 
  12. */  
/*
*Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:项目4.cbp
*作    者:王聪
*完成日期:2015年9月19日
*版 本 号:v1.0
*
*问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
*输入描述:无
*程序输出:输出调整后的线性表
*/


架构:



  • 头文件list.h代码:
  1. #ifndef LIST_H_INCLUDED   
  2. #define LIST_H_INCLUDED   
  3.   
  4. #define MaxSize 50   
  5. #include <stdio.h>   
  6. #include <malloc.h>   
  7. typedef int ElemType;  
  8. typedef struct  
  9. {  
  10.     ElemType data[MaxSize];  
  11.     int length;  
  12. } SqList;  
  13. void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表   
  14. void InitList(SqList *&L);//初始化线性表InitList(L)   
  15. void DestroyList(SqList *&L);//销毁线性表DestroyList(L)   
  16. bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)   
  17. int ListLength(SqList *L);//求线性表的长度ListLength(L)   
  18. void DispList(SqList *L);//输出线性表DispList(L)   
  19. bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)   
  20. int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)   
  21. bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)   
  22. bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)#endif // LIST_H_INCLUDED   
  23. #endif  
#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

  • 功能函数文件list.cpp代码:
  1. #include "list.h"   
  2. //用数组创建线性表   
  3. void CreateList(SqList *&L, ElemType a[], int n)  
  4. {  
  5.     int i;  
  6.     L=(SqList *)malloc(sizeof(SqList));  
  7.     for (i=0; i<n; i++)  
  8.         L->data[i]=a[i];  
  9.     L->length=n;  
  10. }  
  11.   
  12. //初始化线性表InitList(L)   
  13. void InitList(SqList *&L)   //引用型指针   
  14. {  
  15.     L=(SqList *)malloc(sizeof(SqList));  
  16.     //分配存放线性表的空间   
  17.     L->length=0;  
  18. }  
  19.   
  20. //销毁线性表DestroyList(L)   
  21. void DestroyList(SqList *&L)  
  22. {  
  23.     L=(SqList *)malloc(sizeof(SqList));  
  24.     free(L);  
  25. }  
  26.   
  27. //判定是否为空表ListEmpty(L)   
  28. bool ListEmpty(SqList *L)  
  29. {  
  30.     return(L->length==0);  
  31. }  
  32.   
  33. //求线性表的长度ListLength(L)   
  34. int ListLength(SqList *L)  
  35. {  
  36.     return(L->length);  
  37. }  
  38.   
  39. //输出线性表DispList(L)   
  40. void DispList(SqList *L)  
  41. {  
  42.     int i;  
  43.     if (ListEmpty(L)) return;  
  44.     for (i=0; i<L->length; i++)  
  45.         printf("%d ",L->data[i]);  
  46.     printf("\n");  
  47. }  
  48.   
  49. //求某个数据元素值GetElem(L,i,e)   
  50. bool GetElem(SqList *L,int i,ElemType &e)  
  51. {  
  52.     if (i<1 || i>L->length)  return false;  
  53.     e=L->data[i-1];  
  54.     return true;  
  55. }  
  56.   
  57. //按元素值查找LocateElem(L,e)   
  58. int LocateElem(SqList *L, ElemType e)  
  59. {  
  60.     int i=0;  
  61.     while (i<L->length && L->data[i]!=e) i++;  
  62.     if (i>=L->length)  return 0;  
  63.     else  return i+1;  
  64. }  
  65.   
  66. //插入数据元素ListInsert(L,i,e)   
  67. bool ListInsert(SqList *&L,int i,ElemType e)  
  68. {  
  69.     int j;  
  70.     if (i<1 || i>L->length+1)  
  71.         return false;   //参数错误时返回false   
  72.     i--;            //将顺序表逻辑序号转化为物理序号   
  73.     for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置   
  74.         L->data[j]=L->data[j-1];  
  75.     L->data[i]=e;           //插入元素e   
  76.     L->length++;            //顺序表长度增1   
  77.     return true;            //成功插入返回true   
  78. }  
  79.   
  80. //删除数据元素ListDelete(L,i,e)   
  81. bool ListDelete(SqList *&L,int i,ElemType &e)  
  82. {  
  83.     int j;  
  84.     if (i<1 || i>L->length)  //参数错误时返回false   
  85.         return false;  
  86.     i--;        //将顺序表逻辑序号转化为物理序号   
  87.     e=L->data[i];  
  88.     for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移   
  89.         L->data[j]=L->data[j+1];  
  90.     L->length--;              //顺序表长度减1   
  91.     return true;              //成功删除返回true   
  92. }  
#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代码:
    #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[12]= {2,0,1,4,5,8,5,0,6,1,1,4};
        CreateList(sq, a, 12);
        printf("操作前 ");
        DispList(sq);
    
        move(sq);
    
        printf("操作后 ");
        DispList(sq);
        return 0;
    }



    知识点总结: 

       线性表元素的查找及变换。

    学习心得:

       要学会使用算法库,使自己编程更有效率,同时也对算法的理解更加深刻。

     

     

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值