#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
const int Maxsize = 50;
using namespace std;
/*
ADT list
{
数据对象:
D = { ai | 1 <= i <= n, n >=0, a为ElemType类型}
数据关系:
R = {< ai, ai+1> | ai, ai+1 属于D i = 1,2....n-1}
基本运算:
InitList 初始化线性表,构造一个空的线性表L
DestroyList 销毁线性表
ListEmpty 判断为空
ListLength 求线性表的长度
DisList 输出线性表
GetElem 求某一个位置的数据
LocateElem 求第一个与所求数相等的元素的位置
ListInsert 插入数据元素在指定位置
ListDelete 删除指定位置的元素
} */
// 建立一个储存数组的顺序表
typedef struct
{
int Length;
int data[Maxsize];
} List;
void CreatList(List * & L, int a[], int n) //初始化线性表,构造一个空的线性表L
{
int i = 0;
L = ( List *) malloc( sizeof( List ) );
while( i < n )
{
L->data[i] = a[i];
i++;
}
L->Length = n;
}
void InitList( List * & L )
{
L = ( List *) malloc(sizeof(List) );
L->Length = 0;
}
void DestroyList( List *& L) // DestroyList 销毁线性表
{
free( L );
}
bool ListEmpty( List * L) // 判断为空
{
return ( L->Length == 0);
}
int ListLength(List * L) // 求线性表的长度
{
return ( L->Length );
}
void DisList(List * L)// 输出线性表
{
for( int i = 0; i < L->Length; i++)
{
cout << L->data[i] << " ";
}
cout << '\n';
}
bool GetElem(List * L, int i, int &e)// 求某一个位置的数据
{
if( i < 1 || i > L->Length )
return false;
e = L->data[i-1];
return true;
}
bool LocateElem(List * L, int e )// 求第一个与所求数相等的元素的位置
{
int i;
for( i = 0; i < L->Length; i++)
{
if( L->data[i] == e)
return i+1;
}
if( i >= L->Length )
return false;
}
bool ListInsert(List * & L, int i, int e)// 插入数据元素在指定位置
{
if( i < 1 || i > L->Length)
return false;
for( int k = L->Length; k >= i; k--)
{
L->data[k] = L->data[k-1];
}
L->data[i-1] = e;
L->Length++;
return true;
}
bool ListDelete(List * & L, int i, int &e) //删除指定位置的元素
{
if( i < 1 || i > L->Length)
return false;
e = L->data[i-1];
for( int k = i-1; k < L->Length-1; k++ )
{
L->data[k] = L->data[k+1];
}
L->Length--;
return true;
}
/* 设计一个函数,删除其中所有值等于x的元素,时间复杂度O(n) */
//详解看数据结构p39
void delnode1(List *&L, int x)
{
int k = 0;
for( int i = 0; i < L->Length; i++ )
{
if( L->data[i] != x)
{
a[k] = a[i];
k++;
}
}
L->Length = k;
}
void delnode2(List *&L, int x)
{
int k = 0;
for( int i = 0; i < L->Length; i++)
{
if( L->data[i] == x)
k++;
else
a[i-k] = a[i];
}
L->Length -= k;
}
//设计一个算法,以第一个元素为分界线,所有小于等于丫的元素移到他的前面,把所有大与他的元素放在后面
int partition1(List *&L)
{
int i = 0, j = L->Length-1;
int pivot = L->data[0];
while( i <j)
{
while( i < j && L->data[j] > pivot)
j--;
while( i < j && L->data[i] <= pivot)
i++;
if( i < j)
swap(L->data[i], L->data[j]);
}
swap(L->data[0], L->data[i]);
}
int partition2(List *&L)
{
int i = 0, j = L->Length-1;
int pivot = L->data[0];
while( i < j )
{
while( i < j && L->data[j] > pivot)
j--;
L->data[i] = L->data[j];
while( i < j && L->data[i] <= pivot)
i++;
L->data[j] = L->data[i];
}
L->data[i] = pivot;
}
//设计一个算法,将所有奇数移动到偶数的前面
void move1( List *&L)
{
int i = 0, j = L->Length-1;
while( i < j)
{
while( i < j && L->data[j] % 2 == 0)
j--;
while( i < j && L->data[i] % 2 == 1)
i++;
if( i < j)
swap(L->data[i],L->data[j]);
}
swap(L->data[i], L->data[j]);
}
void move2( List *& L)
{
int i = 0, j = -1;
while( i < L->Length )
{
if( L->data[i] % 2 == 1)
{
j++;
swap( L->data[i] , L->data[j]);
}
}
}
int main()
{
int a[10];
int m;
List *L;
for( int i = 0; i < 5; i++)
cin >> a[i];
CreatList(*&L,a,5);
DisList(*&L);
if( ListEmpty(*&L))
printf("%d",L->Length);
return 0;
}