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

来源:互联网 发布:淘宝电脑端描述怎么写 编辑:程序博客网 时间:2024/06/05 04:27
/*Copyright (c) 2015, 烟台大学计算机与控制工程学院      * All rights reserved.      * 文件名称:H1.cpp      * 作者:辛志勐      * 完成日期:2015年9月18日      * 版本号:vc6.0      * 问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。    * 输入描述:无      * 程序输出:线性表的结果      */

 

#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 InitList(SqList *&L);//初始化线性表InitList(L)
bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
void DispList(SqList *L);//输出线性表DispList(L)
//用数组创建线性表
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;
}
//判定是否为空表ListEmpty(L)
bool ListEmpty(SqList *L)
{
    return(L->length==0);
}


//输出线性表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");
}

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[3]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("操作前 ");
    DispList(sq);

    move(sq);

    printf("操作后 ");
    DispList(sq);
    return 0;
}

运行结果

知识点总结:用到了三次while循环,其方法是将第一个偶数与最后一个奇数交换,这样一次交换可以减轻程序的复杂度。

学习心得:学习之中难免会遇到不懂的函数,学习之中也少不了百度这位老师。

0 0
原创粉丝点击