静态顺序表的基本操作 --- ( 尾插,尾删,头插,头删,指定位置插入,指定位置删除,选择排序,二分查找)

typedef int DataType;
#define MAX 10
typedef struct SeqList
{
    DataType data[MAX];
    int sz;
}SeqList,*pSeqList;

静态顺序表基础函数

void InitSeqList(pSeqList pSeq)//初始化
{
    assert(pSeq);
    memset(pSeq->data, 0, sizeof(DataType)*MAX);
    pSeq->sz = 0;
}

void PushBack(pSeqList pSeq, DataType data)//尾插
{
    assert(pSeq != NULL);
    if (pSeq->sz == MAX)
    {
        printf("空间已满\n");
        return 0;
    }
    pSeq->data[pSeq->sz] = data;
    pSeq->sz++;
}

void PrintSeqList(pSeqList pSeq)//打印顺序表
{
    assert(pSeq);
    int i = 0;
    for (i = 0; i < pSeq->sz; i++)
    {
        printf("%d->", pSeq->data[i]);
    }
    printf("NULL\n");
}

void PopBack(pSeqList pSeq)//尾删
{
    assert(pSeq);
    if (pSeq->sz == 0)
    {
        printf("顺序表为空\n");
        return;
    }
    pSeq->sz--;
}

void PushFront(pSeqList pSeq, DataType data)//头插
{
    assert(pSeq);
    if (pSeq->sz == MAX)
    {
        printf("顺序表已满\n");
        return;
    }
    int i = 0;
    for (i = pSeq->sz-1; i >= 0; i--)
    {
        pSeq->data[i+1] = pSeq->data[i];
    }
    pSeq->data[0] = data;
    pSeq->sz++;
}

void PopFront(pSeqList pSeq)//头删
{
    int i = 0;
    assert(pSeq);
    if (pSeq->sz == 0)
    {
        printf("顺序表为空\n");
        return;
    }
    for (i = 0; i < pSeq->sz - 1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->sz--;
}

int Find(pSeqList pSeq, DataType data)//查找指定元素
{
    int i = 0;
    assert(pSeq);
    for (i = 0; i < pSeq->sz; i++)
    {
        if (pSeq->data[i] == data)
            return i;
    }
    return -1;

}

void Insert(pSeqList pSeq, int pos, DataType data)//指定位置插入
{
    int i = 0;
    assert(pSeq);
    if (pSeq->sz == MAX)
    {
        printf("顺序表已满\n");
        return;
    }
    for (i = pSeq->sz - 1; i >= pos - 1; i--)
    {
        pSeq->data[i+1] = pSeq->data[i];
    }
    pSeq->data[pos - 1] = data;
    pSeq->sz++;
}

void Erase(pSeqList pSeq, int pos)//删除指定位置元素
{
    int i = 0;
    assert(pSeq);
    for (i = pos - 1; i < pSeq->sz-1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->sz--;
}

void Remove(pSeqList pSeq, DataType data)//删除指定元素
{
    int i;
    assert(pSeq);
    for (i = 0; i < pSeq->sz; i++)
    {
        if (pSeq->data[i] == data)
            break;
    }
    for (; i < pSeq->sz - 1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }
    pSeq->sz--;
}

void RemoveAll(pSeqList pSeq, DataType data)//删除所有的指定元素
{
    int i;
    int count = 0;
    assert(pSeq);
    for (i = 0; i < pSeq->sz; i++)
    {

        if (pSeq->data[i] != data)
        {
            pSeq->data[count++] = pSeq->data[i];
        }
    }
    pSeq->sz = count;
}

int Size(pSeqList pSeq)//返回顺序表的大小
{
    assert(pSeq);
    return (pSeq->sz*sizeof(DataType));
}

int Empty(pSeqList pSeq)//判断顺序表是否为空
{
    assert(pSeq);
    return pSeq->sz;
}

void swap(DataType *p1,DataType *p2)
{
    DataType tmp;
    tmp = *p2;
    *p2 = *p1;
    *p1 = tmp;
}

void BubbleSort(pSeqList pSeq)//冒泡排序
{
    assert(pSeq);
    int i = 0;
    int j = 0;
    for (i = 0; i < pSeq->sz-1; i++)
    {
        for (j = 0; j < pSeq->sz - 1 - i;j++)
        {
            if (pSeq->data[j] < pSeq->data[j + 1])
            {
                swap(pSeq->data + j, pSeq->data + j + 1);
            }
        }

    }
}

void SelectSort(pSeqList pSeq)//选择排序
{
    assert(pSeq);
    int i = 0;
    for (i = 0; i < pSeq->sz - 1; i++)
    {
        int m = 0;
        int j = 0;
        for (j = 1; j < pSeq->sz - i; j++)
        {
            if (pSeq->data[m] > pSeq->data[j])
                m = j;

        }
        swap(pSeq->data + m, pSeq->data+pSeq->sz - 1 - i);
    }

}

void SelectSortOP(pSeqList pSeq)//选择排序优化
{
    assert(pSeq);
    int i = 0;
    int j = 0;
    int start = 0;
    int end = pSeq->sz-1;
    while (start < end)
    {
        int maxpos = start;
        int minpos = start;
        i = start;
        for (; i < end; i++)
        {
            if (pSeq->data[maxpos] < pSeq->data[i + 1])
                maxpos = i + 1;
            if (pSeq->data[minpos] > pSeq->data[i + 1])
                minpos = i + 1;
        }
        /*swap(pSeq->data + maxpos, pSeq->data + end);
        if (maxpos != start || minpos != end)
        {
            if (minpos == end)
            {
                minpos == maxpos;
                swap(pSeq->data + minpos, pSeq->data + start);
            }
            else
                swap(pSeq->data + minpos, pSeq->data + start);
        }*/
        if (minpos != start)
        {
            swap(pSeq->data + minpos, pSeq->data + start);
        }
        if (maxpos == start)
        {
            maxpos = minpos;
        }
        if(maxpos!=end)
        {
            swap(pSeq->data + maxpos, pSeq->data + end);
        }
            start++;
            end--;
    }
}

int BinarySearch(pSeqList pSeq, DataType data)//二分查找
{
    assert(pSeq);
    int left = 0;
    int right = pSeq->sz - 1;
    while (left < right)
    {
        int mid = left + (right - left) / 2;
        if (pSeq->data[mid] > data)
        {
            right = mid;
            left;
        }
        else if (pSeq->data[mid] < data)
        {
            left = mid;
            right;
        }
        else
            return mid;
    }
    return -1;
}

int BinarySearch_R(pSeqList pSeq, int left, int right, DataType d)//二分查找递归
{
    assert(pSeq);
    if (left > right)
        return-1;
    int mid = left + (right - left) / 2;
    if (pSeq->data[mid] > d)
        BinarySearch_R(pSeq, left, mid, d);
    else if (pSeq->data[mid] < d)
        BinarySearch_R(pSeq, mid, right, d);
    else
        return mid;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值