顺序表(静态)

实现一个顺序表的增删查找、排序(冒泡、快速排序)功能

编程思想:
TDD,模块化实现

  • 顺序表的声明(SeqList.h)
#pragma once  //防止头文件的多次引用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define N 10
typedef int DataType;

typedef struct SeqList
{
    DataType arr[N];
    size_t size;
}SeqList,* pSeqList;

void Test();
void SeqListInit(pSeqList s);//初始化
void SeqListPushFront(pSeqList s, DataType x);//头插
void SeqListPushBack(pSeqList s, DataType x);//尾插
void SeqListPopFront(pSeqList s);//头删
void SeqListPopBack(pSeqList s);//尾删
void SeqListInsert(pSeqList s,size_t pos, DataType x);//任意位置插
void SeqListEarse(pSeqList s,size_t pos);//任意位置删
int SeqListFind(pSeqList s, DataType x);//查找
void SeqListModify(pSeqList s, size_t pos,DataType x);//修改
int SeqListEmpty(pSeqList s);// 判断是否为空,1 表示空, 0 表示不空 
int SeqListSize(pSeqList s);// 返回数量 
void SeqListClear(pSeqList s);// 清空 
void SeqListRemove(pSeqList s, DataType x);//删除第一个x
void SeqListRemoveAll(pSeqList s, DataType x);//删除所有x
void SeqListBubbleSort(pSeqList s);//冒泡排序
void SeqListSelectSort(pSeqList s);//选择排序
int SeqListBinarary(pSeqList s, DataType x);//二分查找
void SeqLisPrint(pSeqList s);// 打印
  • 顺序表的功能实现(SeqList.c)
#include "SeqList.h"
void SeqListInit(pSeqList s)//初始化
{
    assert(s);
    memset(s->arr, 0, sizeof(DataType)*N);
    s->size = 0;
}
void SeqListPushFront(pSeqList s, DataType x)//头插
{
    assert(s->size<N);
    SeqListInsert(s, 0, x);//任意插的特殊情况   
}
void SeqListPushBack(pSeqList s, DataType x)//尾插
{
    SeqListInsert(s, s->size, x);//任意插的特殊情况     
}
void SeqListPopFront(pSeqList s)//头删
{
    assert(s);
    if (s->size == 0)
    {
        printf("顺序表为空\n");
        return;
    }
    else
    {
        size_t end = 0;
        while (end < s->size - 1)
        {
            s->arr[end] = s->arr[end + 1];
            end++;
        }
        s->size--;
    }
}
void SeqListPopBack(pSeqList s)//尾删
{
    assert(s);
    if (s->size == 0)
    {
        printf("顺序表为空\n");
        return;
    }
    else
        s->size--;
}
void SeqListInsert(pSeqList s, size_t pos, DataType x)//任意位置插
{
    assert(s);
    assert(0 <= pos && pos <= s->size);
    if (s->size >= N)
    {
        printf("顺序表已满\n");
        return;
    }
    else
    {
        DataType end = s->size;
        while (end >(DataType)pos)
        {
            s->arr[end] = s->arr[end - 1];
            end--;
        }
        s->arr[pos] = x;
        s->size++;
    }
}
void SeqListEarse(pSeqList s, size_t pos)//任意位置删
{
    assert(s);
    size_t end = pos;
    if (s->size == 0)
    {
        printf("顺序表为空\n"); 
        return;
    }
    while (end < s->size-1)
    {
        s->arr[end] = s->arr[end + 1];
        end++;
    }
    s->size--;
}
int SeqListFind(pSeqList s,DataType x)//查找
{
    assert(s);
    size_t i = 0;
    for (i = 0; i < s->size; i++)
    {
        if (s->arr[i] == x)
            return i;
    }
    return -1;
}
int SeqListEmpty(pSeqList s)// 判断是否为空,1 表示空, 0 表示不空 
{
    return s->size ? 1 : 0;
}
void SeqListModify(pSeqList s, size_t pos,DataType x)//修改
{
    assert(s);
    s->arr[pos] = x;
}
int SeqListSize(pSeqList s)// 返回数量 
{
    return s->size;
}
void SeqListClear(pSeqList s)// 清空 
{
    SeqListInit(s);
}
void SeqListRemove(pSeqList s, DataType x)//删除第一个x
{
    size_t pos = SeqListFind(s, x);
    SeqListEarse(s, pos);
}
void SeqListRemoveAll(pSeqList s, DataType x)//删除所有x
{
    size_t index = 0, dest = 0;
    size_t count = 0;
    assert(s);
    while (index < s->size)
    {
        if (s->arr[index] != x)
        {
            s->arr[dest] = s->arr[index];
            dest++;
        }
        else
            count++;
        index++;
    }
    s->size -= count;
}
void Swap(DataType *left, DataType *right)
{
    DataType tmp = *left;
    *left = *right;
    *right = tmp;
}
void SeqListBubbleSort(pSeqList s)//冒泡排序
{
    DataType end = (DataType)s->size - 1;
    assert(s);
    while (end >= 0)
    {
        size_t exchange = 0;
        DataType i = 0;
        for (; i < end; i++)
        {
            if (s->arr[i]>s->arr[i + 1])
                Swap(&s->arr[i] , &s->arr[i + 1]);
            exchange = 1;
        }
        if (exchange = 0)
            break;
        end--;
    }
}
void SeqListSelectSort(pSeqList s)//选择排序
{
    DataType left = 0;
    DataType right = s->size - 1;
    assert(s);
    while (left < right)
    {
        DataType min = left, max = right, i = left;
        while (i <= right)
        {
            if (s->arr[min] > s->arr[i])
                min = i;
            if (s->arr[max] < s->arr[i])
                max = i;
            i++;
        }
        Swap(&s->arr[left], &s->arr[min]);
        if (max == left)
            max = min;
        Swap(&s->arr[right], &s->arr[max]);
        left++;
        right--;
    }
}
int SeqListBinarary(pSeqList s,DataType x)//二分查找
{
    DataType left = 0;
    DataType right = s->size - 1;
    assert(s);
    SeqListBubbleSort(s);
    while (left <= right)
    {
        DataType mid = left + (right - left) / 2;
        if (s->arr[mid] < x)
            left++;
        else if (s->arr[mid] > x)
            right--;
        else
            return mid;
    }
    return -1;
}
void SeqListPrint(pSeqList s)// 打印
{
    size_t i = 0;
    for (i = 0; i < s->size; i++)
    {
        printf("%d ", s->arr[i]);
    }
    printf("\n");
}
  • 测试代码
void Test()//调用
{
    SeqListInit(&s);//初始化
    SeqListPushFront(&s, 1);//头插
    SeqListPushFront(&s, 2);//头插
    SeqListPushFront(&s, 1);//头插
    SeqListPushFront(&s, 4);//头插
    SeqListPrint(&s);// 打印

    SeqListPushBack(&s, 1);//尾插
    SeqListPushBack(&s, 5);//尾插
    SeqListPushBack(&s, 3);//尾插
    SeqListPushBack(&s, 1);//尾插
    SeqListPrint(&s);// 打印

    SeqListPopFront(&s);//头删
    SeqListPrint(&s);// 打印

    SeqListPopBack(&s);//尾删
    SeqListPrint(&s);// 打印

    SeqListInsert(&s, 2, 9);//任意位置插
    SeqListPrint(&s);// 打印

    SeqListEarse(&s, 3);//任意位置删
    SeqListPrint(&s);// 打印

    SeqListModify(&s, 2, 3);//修改
    SeqListPrint(&s);// 打印

    int num = SeqListFind(&s, 3);//查找
    if (num != -1)
        printf("找到了,下标%d\n", num);
    else
        printf("该数不存在\n");

    int n = SeqListEmpty(&s);// 判断是否为空,1 表示空, 0 表示不空 
    if (n == 1)
        printf("为空\n");
    else
        printf("不为空\n");

    int count = SeqListSize(&s);// 返回数量 
    printf("顺序表个数为%d\n", count);

    SeqListRemove(&s, 3);//删除第一个x
    SeqListPrint(&s);// 打印

    SeqListRemoveAll(&s, 1);//删除所有x
    SeqListPrint(&s);// 打印

    SeqListClear(&s);// 清空 
    SeqListPrint(&s);// 打印

    SeqListPushFront(&s, 1);//头插
    SeqListPushFront(&s, 4);//头插
    SeqListPushFront(&s, 9);//头插
    SeqListPushFront(&s, 6);//头插
    SeqListPrint(&s);// 打印

    SeqListBubbleSort(&s);//冒泡排序
    SeqListPrint(&s);// 打印

    SeqListPushFront(&s, 2);//头插
    SeqListPushFront(&s, 0);//头插
    SeqListPushFront(&s, 7);//头插
    SeqListPushFront(&s, 5);//头插
    SeqListPrint(&s);// 打印

    SeqListSelectSort(&s);//快速排序
    SeqListPrint(&s);// 打印

    int ret = SeqListBinarary(&s, 0);//二分查找
    if (ret != -1)
        printf("找到了,下标为%d\n", ret);
    else
        printf("没找到\n");
}
  • 顺序表的主函数(mian.c)
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
int main()
{
    Test();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值