动态顺序表(C语言实现)

来源:互联网 发布:淘宝怎么看买家秀 编辑:程序博客网 时间:2024/05/21 07:49

数据结构:

typedef int DataType,*pDataType;typedef struct Seqlist{    pDataType pdata;//指向动态开辟的区域    int sz;//有效个数    int capacity;//容量} Seqlist,*pSeqlist;

方法:

void InitSeqlist(pSeqlist ps);//初始化void DestroySeqlist(pSeqlist ps);//销毁void PushBack(pSeqlist ps, DataType d);//后插void PrintBack(pSeqlist ps);//打印void PopBack(pSeqlist ps);//后删void PushFront(pSeqlist ps,DataType d);//前插void PopFront(pSeqlist ps);//前删void Insert(pSeqlist ps, int pos, DataType d);//指定位置插入int Find(pSeqlist ps, DataType d);//遍历排序void Remove(pSeqlist ps, DataType d);//删除void ReverseSeqlist(pSeqlist ps);//逆序void SortSeqlist(pSeqlist ps);//排序int BinarySearch(pSeqlist ps, DataType d);//二分查找

代码实现:


test.c

#include"Seqlist_D.h"void test(){    Seqlist seqlist;    int ret = 0;    InitSeqlist(&seqlist);//初始化    PushBack(&seqlist, 1);//后插    PushBack(&seqlist, 2);//后插    PushBack(&seqlist, 3);//后插    PushBack(&seqlist, 4);//后插    PushBack(&seqlist, 5);//后插    PrintBack(&seqlist);//打印    PopBack(&seqlist);//后删    PushFront(&seqlist, 2);//前插    PrintBack(&seqlist);//打印    PopFront(&seqlist);//前删    PrintBack(&seqlist);//打印    ret = Find(&seqlist, 2);//遍历排序    printf("%d \n",ret);    Insert(&seqlist, 1, 5);//指定位置插入    PrintBack(&seqlist);//打印    Remove(&seqlist, 2);//删除    PrintBack(&seqlist);//打印    ReverseSeqlist(&seqlist);//逆序    PrintBack(&seqlist);//打印    SortSeqlist(&seqlist);//排序    PrintBack(&seqlist);//打印    ret = BinarySearch(&seqlist, 2);//二分查找    printf("%d \n",ret);}int main(){    test();    return 0;}

Seqlist_D.h

#ifndef __SEQLIST_D_H__#define __SEQLIST_D_H__#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#define DEFALUT_SZ 3//初始化分配元素个数#define DEFALUT_INC 2//增容时增加元素个数#define FORMAT "%d "typedef int DataType,*pDataType;typedef struct Seqlist{    pDataType pdata;//指向动态开辟的区域    int sz;//有效个数    int capacity;//容量} Seqlist,*pSeqlist;void InitSeqlist(pSeqlist ps);//初始化void DestroySeqlist(pSeqlist ps);//销毁void PushBack(pSeqlist ps, DataType d);//后插void PrintBack(pSeqlist ps);//打印void PopBack(pSeqlist ps);//后删void PushFront(pSeqlist ps,DataType d);//前插void PopFront(pSeqlist ps);//前删void Insert(pSeqlist ps, int pos, DataType d);//指定位置插入int Find(pSeqlist ps, DataType d);//遍历排序void Remove(pSeqlist ps, DataType d);//删除void ReverseSeqlist(pSeqlist ps);//逆序void SortSeqlist(pSeqlist ps);//排序int BinarySearch(pSeqlist ps, DataType d);//二分查找#endif//__SEQLIST_D_H__

Seqlist_D.c

#include"Seqlist_D.h"void IncreatCatacity(pSeqlist ps)//增容{    pDataType tmp = NULL;    assert(ps != NULL);    tmp = (pDataType)realloc(ps->pdata, (ps->capacity + DEFALUT_INC)*sizeof(DataType));    if (tmp == NULL)    {        printf("增容失败!\n");    }    else    {        ps->pdata = tmp;        ps->capacity += DEFALUT_INC;    }}void InitSeqlist(pSeqlist ps)//初始化{    pDataType tmp = NULL;    assert(ps != NULL);    tmp = (pDataType)malloc(DEFALUT_SZ*sizeof(DataType));    if (tmp == NULL)    {        printf("初始化失败!\n");    }    else    {        ps->pdata = tmp;        ps->capacity = DEFALUT_SZ;        ps->sz = 0;    }}void DestroySeqlist(pSeqlist ps)//销毁{    assert(ps != NULL);    ps->sz = 0;    ps->capacity = 0;    free(ps->pdata);}void PushBack(pSeqlist ps, DataType d)//后插{    assert(ps != NULL);    if (ps->sz == ps->capacity)    {        IncreatCatacity(ps);        ps->pdata[ps->sz] = d;        ps->sz++;    }    else    {        ps->pdata[ps->sz] = d;        ps->sz++;    }}void PrintBack(pSeqlist ps)//打印{    int i = 0;    assert(ps != NULL);    for (i = 0; i < ps->sz; i++)    {        printf(FORMAT, ps->pdata[i]);    }    printf("\n");}void PopBack(pSeqlist ps)//后删{    assert(ps != NULL);    if (ps->sz == 0)    {        printf("顺序表为空,删除失败!\n");    }    else    {        ps->sz--;    }}void PushFront(pSeqlist ps, DataType d)//前插{    int i = 0;    assert(ps != NULL);    if (ps->capacity == ps->sz)    {        IncreatCatacity(ps);        for (i = ps->sz; i > 0; i--)        {            ps->pdata[i] = ps->pdata[i - 1];        }        ps->pdata[0] = d;        ps->sz++;    }    else    {        for (i = ps->sz; i > 0; i--)        {            ps->pdata[i] = ps->pdata[i - 1];        }        ps->pdata[0] = d;        ps->sz++;    }}void PopFront(pSeqlist ps)//前删{    int i = 0;    assert(ps != NULL);    if (ps->sz == 0)    {        printf("顺序表为空,删除失败!\n");    }    else    {        for (i = 0; i < ps->sz - 1; i++)        {            ps->pdata[i] = ps->pdata[i + 1];        }        ps->sz--;    }}void Insert(pSeqlist ps, int pos, DataType d)//指定位置插入{    int i = 0;    assert(ps != NULL);    if (ps->sz == ps->capacity)    {        IncreatCatacity(ps);        if ((pos<0)||(pos>ps->sz))        {            printf("插入位置有误!\n");        }        else        {            for (i = ps->sz; i >pos; i--)            {                ps->pdata[i] = ps->pdata[i - 1];            }            ps->pdata[pos] = d;            ps->sz++;        }    }    else    {        if ((pos<0) || (pos>ps->sz))        {            printf("插入位置有误!\n");        }        else        {            for (i = ps->sz; i >pos; i--)            {                ps->pdata[i] = ps->pdata[i - 1];            }            ps->pdata[pos] = d;            ps->sz++;        }    }}int Find(pSeqlist ps, DataType d)//遍历排序{    int i = 0;    assert(ps != NULL);    for (i = 0; i < ps->sz; i++)    {        if (ps->pdata[i] == d)            return i;    }    return -1;}void Remove(pSeqlist ps, DataType d)//删除{    int ret = 0;    int i = 0;    assert(ps != NULL);    ret = Find(ps,d);    if (ret == -1)    {        printf("未找到所要删除的元素!\n");    }    else    {        for (i = ret; i < ps->sz - 1; i++)        {            ps->pdata[i] = ps->pdata[i + 1];        }        ps->sz--;    }}void ReverseSeqlist(pSeqlist ps)//逆序{    int left = 0;    int right = 0;    DataType tmp = 0;    assert(ps != NULL);    right = ps->sz - 1;    while (left < right)    {        tmp = ps->pdata[left];        ps->pdata[left] = ps->pdata[right];        ps->pdata[right] = tmp;        left++;        right--;    }}void SortSeqlist(pSeqlist ps)//排序{    int i = 0;    int j = 0;    DataType tmp = 0;    assert(ps != NULL);    for (i = 0; i < ps->sz - 1; i++)    {        for (j = 0; j < ps->sz - 1 - i; j++)        {            if (ps->pdata[j] > ps->pdata[j + 1])            {                tmp = ps->pdata[j];                ps->pdata[j] = ps->pdata[j + 1];                ps->pdata[j + 1] = tmp;            }        }    }}int BinarySearch(pSeqlist ps, DataType d)//二分查找{    int left = 0;    int right = 0;    int mid = 0;    assert(ps != NULL);    right = ps->sz - 1;    while (left <= right)    {        mid = left + ((right - left) >> 1);        if (ps->pdata[mid]>d)        {            right = mid - 1;        }        else if (ps->pdata[mid]<d)        {            left = mid + 1;        }        else        {            return mid;        }    }    return -1;}

结果贴图:

这里写图片描述