问题及代码:
/*
* Copyright (c) 2016, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:Cube007.cpp
* 作 者:刘小楠
* 完成日期:2016年9月18日
*
* 问题描述:将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
* 输入描述:线性表长度、线性表中各元素
* 输出描述:调整顺序后的线性表
*/
main.cpp
#include <iostream>
#include <malloc.h>
#include <cstdio>
#include "list.h"
using namespace std;
int main()
{
int i,Llength;
Sqlist *l;
Elemtype a[Maxsize];
printf("请输入线性表长度:\n");
scanf("%d",&Llength);
printf("请输入线性表中各元素:\n");
for(i=0;i<Llength;i++)
scanf("%d",&a[i]);
CreateList(l,a,Llength);
movejs(l);
DispList(l);
return 0;
}
list.h
#define Maxsize 100
typedef int Elemtype; //自定义数据类型
typedef struct list
{
Elemtype data[Maxsize]; //存顺序表元素
int length; //存顺序表长度
} Sqlist;
void CreateList(Sqlist *&l,Elemtype a[],int n); //由a中的n个元素建立顺序表
void DispList(Sqlist *l); //输出线性表
void movejs(Sqlist *&l); //移动奇数
lxn.cpp
#include <stdio.h>
#include <malloc.h>
#include "list.h"
void CreateList(Sqlist *&l,Elemtype a[],int n) //由a中的n个元素建立顺序表
{
int i;
l=(Sqlist *)malloc(sizeof(Sqlist)); //分配存储空间
for(i=0;i<n;i++)
l->data[i]=a[i]; //存放元素
l->length=n; //设置长度
}
void DispList(Sqlist *l) //输出线性表
{
int i;
for(i=0;i<l->length;i++)
printf("%d ",l->data[i]);
printf("\n");
}
void movejs(Sqlist *&l) //移动奇数
{
int i=0,j=l->length-1;
Elemtype t;
while (i<j)
{
while ((i<j) && (l->data[j]%2==0)) //从右往左遍历找第一个奇数
j--;
while ((i<j) && (l->data[i]%2==1)) //从左往右遍历找第一个偶数
i++;
if (i<j) //如果未到达“分界线”,将上述循环中找到的奇数和偶数交换
{
t=l->data[i];
l->data[i]=l->data[j];
l->data[j]=t;
}
}
}
程序截图:
知识点总结:
主要应用了线性表元素的查找及变换,主要实现依赖于move函数。
学习心得:
随着做完第三周的项目,掌握了基本算法库的应用。