顺序表的增删改查及冒泡、选择排序、二分查找

实现的功能:
1、初始化顺序表:

void SeqInit(SeqList* pSeq)
{
    pSeq->_size = 0;
    pSeq->_capicity = MAX;
    pSeq->_a = (DataType*)malloc(sizeof(DataType)*pSeq->_capicity);

    memset(pSeq->_a, 0, sizeof(DataType)*pSeq->_capicity);
}

2、打印顺序表:

void SeqPrint(SeqList* pSeq)
{
    size_t i=0;
    for(i=0;i<pSeq->_size;i++)
    {
        printf("%d ",pSeq->_a[i]);
    }
}

3、判满加扩容

SeqList* SeqCheckFull(SeqList* pSeq)
{
    assert(pSeq);
    if(pSeq->_size==pSeq->_capicity)
    {
        DataType *tmp=(DataType*)realloc(pSeq->_a,sizeof(DataType)*pSeq->_capicity*2);
        if(NULL==tmp)
        {
            printf("扩容失败\n");
            return NULL;
        }
        pSeq->_capicity=pSeq->_capicity*2;
        pSeq->_a=tmp;

    }
    return pSeq;



}

4、销毁

void SeqDestory(SeqList* pSeq)
{
    free(pSeq->_a);
    pSeq->_size=0;

}

5、任意位置插入:

void SeqInsert(SeqList* pSeq, size_t pos, DataType x)//任意插
{
    assert(pSeq);
    pSeq = SeqCheckFull(pSeq);
    if (pSeq != NULL)
    {
        if (0 == pSeq->_size)
        {
            pSeq->_a[pSeq->_size++] = x;

        }
        else
        {
            int end = pSeq->_size - 1;
            while (end >= (int)pos)
            {
                pSeq->_a[end + 1] = pSeq->_a[end];
                end--;
            }
            pSeq->_a[pos] = x;

            ++pSeq->_size;
        }
    }
}

6、任意位置删除

void SeqErase(SeqList* pSeq, size_t pos)//任意删除
{
    size_t begin=pos;
    assert(pSeq);
    assert(pos<pSeq->_size);
    if(pSeq->_size==0)
    {
        printf("此链表为空\n");
        return;
    }
    while((int)begin<pSeq->_size)
    {
        pSeq->_a[begin]=pSeq->_a[begin+1];
        begin++;
    }
    pSeq->_size--;




}

7、修改

void SeqAt(SeqList* pSeq, size_t pos, DataType x)//替换
{
         assert(pSeq);
         assert(pos<pSeq->_size);
         pSeq->_a[pos]=x;
}
void swap(DataType *x,DataType *y)
{
    *x^=*y;
    *y^=*x;
    *x^=*y;
}

8、查找

int SeqFind(SeqList* pSeq, DataType x)//查找
{
    size_t i;
    assert(pSeq);
    for(i=0;i<pSeq->_a[i];i++)
    {
        if(x==pSeq->_a[i])
        {
            return i;
        }
    }
    return -1;


}

9、冒泡

void BubbleSort(SeqList* pSeq)//冒泡排序
{
    size_t i=0;
    size_t j=0;

    for(i=0;i<pSeq->_size-1;i++)
    {
        int flag=0;
        for(j=0;j<pSeq->_size-1-i;j++)
        {
            if((pSeq->_a[j])>(pSeq->_a[j+1]))
            swap((&pSeq->_a[j]),(&pSeq->_a[j+1]));
            flag=1;
        }
        if(0==flag)
       {
        return;
        }
    }




}

10、选择

void SelectSort(SeqList* pSeq)//选择排序
{

    size_t begin=0;
    size_t end=pSeq->_size-1;

    assert(pSeq);
    while(begin<=end)
    {
    size_t min=begin;
    size_t max=begin;
    size_t i=begin;
    for(i=begin;i<=end;i++)
    {
        if(pSeq->_a[i]<pSeq->_a[min])
            min=i;

        if(pSeq->_a[i]>pSeq->_a[max])
            max=i;
    }   
        swap(&(pSeq->_a[begin]),&(pSeq->_a[min]));
        if(begin==max)
            max=min;
        swap(&(pSeq->_a[end]),&(pSeq->_a[max]));
         begin++;
         end--;
    }






}

11、二分

int BinarySearch(SeqList* pSeq, DataType x)
{
    int begin=0;
    int end=pSeq->_size-1;
    while(begin<=end)
    {
    int  mid=begin+((end-begin)>>1);
    if(pSeq->_a[mid]<x)
    {
        begin=mid+1;
    }
    else if(x<pSeq->_a[mid])
    {
        end=mid-1;
    }
    else
        return mid;
    }
    return -1;


}

整体代码:

SeqList.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

#define MAX 10

typedef int DataType; //类型重定义

typedef struct SeqList
{
    DataType* _a;
    size_t _size;
    size_t _capicity;
}SeqList;


void SeqPrint(SeqList* pSeq);  //打印
void SeqInit(SeqList* pSeq);   //初始化
void SeqDestory(SeqList* pSeq); //释放
SeqList* SeqCheckFull(SeqList* pSeq);//判满+扩容

void SeqPushBack(SeqList* pSeq, DataType x); //尾插
void SeqPopBack(SeqList* pSeq);   //尾删
void SeqPushFront(SeqList* pSeq, DataType x); //头插
void SeqPopFront(SeqList* pSeq);  //头删

void SeqInsert(SeqList* pSeq, size_t pos, DataType x);//指定位置插入
void SeqErase(SeqList* pSeq, size_t pos);  //指定位置删除

int SeqFind(SeqList* pSeq, DataType x);   //查找指定元素
void SeqAt(SeqList* pSeq, size_t pos, DataType x); //替换指定位置元素

void BubbleSort(SeqList* pSeq); //冒泡排序
void SelectSort(SeqList* pSeq); //选择排序
int BinarySearch(SeqList* pSeq, DataType x); //二分查找

#endif

SeqList.c

#include"SeqList.h"
SeqList* SeqCheckFull(SeqList* pSeq)
{
    assert(pSeq);
    if(pSeq->_size==pSeq->_capicity)
    {
        DataType *tmp=(DataType*)realloc(pSeq->_a,sizeof(DataType)*pSeq->_capicity*2);
        if(NULL==tmp)
        {
            printf("扩容失败\n");
            return NULL;
        }
        pSeq->_capicity=pSeq->_capicity*2;
        pSeq->_a=tmp;

    }
    return pSeq;



}
void SeqDestory(SeqList* pSeq)
{
    free(pSeq->_a);
    pSeq->_size=0;

}
void SeqInit(SeqList* pSeq)
{
    pSeq->_size = 0;
    pSeq->_capicity = MAX;
    pSeq->_a = (DataType*)malloc(sizeof(DataType)*pSeq->_capicity);

    memset(pSeq->_a, 0, sizeof(DataType)*pSeq->_capicity);
}
void SeqPrint(SeqList* pSeq)
{
    size_t i=0;
    for(i=0;i<pSeq->_size;i++)
    {
        printf("%d ",pSeq->_a[i]);
    }
}
void SeqPushBack(SeqList* pSeq, DataType x)
{
    assert(pSeq);
    SeqInsert(pSeq, pSeq->_size, x);

}
void SeqPopBack(SeqList* pSeq)
{

    SeqErase(pSeq,pSeq->_size-1);
    /*if(pSeq->_size==0)
    {
        printf("此链表为空\n");
        return;
    }
    else
    {
        pSeq->_size--;
    }*/

}
void SeqPushFront(SeqList* pSeq, DataType x)
{
    assert(pSeq);
    SeqInsert(pSeq,0,x);

}
void SeqPopFront(SeqList* pSeq)
{
    assert(pSeq);


    /*size_t begin=1;
    assert(pSeq);

    if(pSeq->_size==0)
    {
        printf("此链表为空\n");
        return;
    }
    else
    {
       pSeq->_a[begin-1]=pSeq->_a[begin];
       begin++;
    }
    pSeq->_size--;*/
    SeqErase(pSeq,0);
}
void SeqInsert(SeqList* pSeq, size_t pos, DataType x)//任意插
{
    assert(pSeq);
    pSeq = SeqCheckFull(pSeq);
    if (pSeq != NULL)
    {
        if (0 == pSeq->_size)
        {
            pSeq->_a[pSeq->_size++] = x;

        }
        else
        {
            int end = pSeq->_size - 1;
            while (end >= (int)pos)
            {
                pSeq->_a[end + 1] = pSeq->_a[end];
                end--;
            }
            pSeq->_a[pos] = x;

            ++pSeq->_size;
        }
    }
}

void SeqErase(SeqList* pSeq, size_t pos)//任意删除
{
    size_t begin=pos;
    assert(pSeq);
    assert(pos<pSeq->_size);
    if(pSeq->_size==0)
    {
        printf("此链表为空\n");
        return;
    }
    while((int)begin<pSeq->_size)
    {
        pSeq->_a[begin]=pSeq->_a[begin+1];
        begin++;
    }
    pSeq->_size--;




}
int SeqFind(SeqList* pSeq, DataType x)//查找
{
    size_t i;
    assert(pSeq);
    for(i=0;i<pSeq->_a[i];i++)
    {
        if(x==pSeq->_a[i])
        {
            return i;
        }
    }
    return -1;


}
void SeqAt(SeqList* pSeq, size_t pos, DataType x)//替换
{
         assert(pSeq);
         assert(pos<pSeq->_size);
         pSeq->_a[pos]=x;
}
void swap(DataType *x,DataType *y)
{
    *x^=*y;
    *y^=*x;
    *x^=*y;
}
void BubbleSort(SeqList* pSeq)//冒泡排序
{
    size_t i=0;
    size_t j=0;

    for(i=0;i<pSeq->_size-1;i++)
    {
        int flag=0;
        for(j=0;j<pSeq->_size-1-i;j++)
        {
            if((pSeq->_a[j])>(pSeq->_a[j+1]))
            swap((&pSeq->_a[j]),(&pSeq->_a[j+1]));
            flag=1;
        }
        if(0==flag)
       {
        return;
        }
    }




}
void SelectSort(SeqList* pSeq)//选择排序
{

    size_t begin=0;
    size_t end=pSeq->_size-1;

    assert(pSeq);
    while(begin<=end)
    {
    size_t min=begin;
    size_t max=begin;
    size_t i=begin;
    for(i=begin;i<=end;i++)
    {
        if(pSeq->_a[i]<pSeq->_a[min])
            min=i;

        if(pSeq->_a[i]>pSeq->_a[max])
            max=i;
    }   
        swap(&(pSeq->_a[begin]),&(pSeq->_a[min]));
        if(begin==max)
            max=min;
        swap(&(pSeq->_a[end]),&(pSeq->_a[max]));
         begin++;
         end--;
    }






}
int BinarySearch(SeqList* pSeq, DataType x)
{
    int begin=0;
    int end=pSeq->_size-1;
    while(begin<=end)
    {
    int  mid=begin+((end-begin)>>1);
    if(pSeq->_a[mid]<x)
    {
        begin=mid+1;
    }
    else if(x<pSeq->_a[mid])
    {
        end=mid-1;
    }
    else
        return mid;
    }
    return -1;


}

test.c(测试部分)//此处列出部分测试函数

#include"SeqList.h"
SeqList L;
void test1()
{
    SeqInit(&L);
    SeqPushBack(&L,1);
    SeqPushBack(&L,2);
    SeqPushBack(&L,3);
    SeqPopBack(&L);
    SeqPopBack(&L);


    SeqPrint(&L);

}
void test3()
{
    SeqInit(&L);
    SeqPushFront(&L,1);
    SeqPushFront(&L,2);
    SeqPopFront(&L);


    SeqPrint(&L);
    printf("\n");
}
void test2()
{
    SeqInit(&L);
    SeqInsert(&L,0,1);
    SeqInsert(&L,0,1);
    SeqInsert(&L,1,2);
    SeqInsert(&L,2,20);
    SeqPrint(&L);
    printf("\n");
    printf("%d",SeqFind(&L,20));
    printf("\n");

    SeqAt(&L,1,4);
    SeqPrint(&L);
    /*SeqErase(&L,0);

    SeqPrint(&L);
    SeqErase(&L,1);
     printf("\n");
    SeqPrint(&L);
    printf("\n");*/
}
void test4()//冒泡
{
    SeqInit(&L);
    SeqPushBack(&L,3);
    SeqPushBack(&L,12);
    SeqPushBack(&L,4);
    SeqPushBack(&L,65);
    SeqPushBack(&L,32);
    SeqPushBack(&L,1);
    SeqPushBack(&L,9);
    SeqPrint(&L);
    printf("\n");
    BubbleSort(&L);

    SeqPrint(&L);
}
void test5()//二分法
{
    int ret=0;
    SeqInit(&L);
    SeqPushBack(&L,1);
    SeqPushBack(&L,2);
    SeqPushBack(&L,3);
    SeqPushBack(&L,4);
    SeqPushBack(&L,5);
    SeqPushBack(&L,6);
    SeqPushBack(&L,7);
    SeqPrint(&L);
     ret= BinarySearch(&L,7);
    printf("\n");


    if (-1 == ret)
    {
        printf("没找到\n");
    }
    else
    {
        printf("下标是%d\n", ret);
    }


}
void test6()//选择排序法
{

    SeqInit(&L);
    SeqPushBack(&L,4);
    SeqPushBack(&L,2);
    SeqPushBack(&L,1);
    SeqPushBack(&L,5);

    SeqPrint(&L);
    printf("\n");
    SelectSort(&L);
    SeqPrint(&L);


}
int main()
{

    test6();

    system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值