线性表的建立和使用

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值