C语言-静态实现顺序表

C语言实现了个静态的顺序表,如果有不对的地方,还请指正

SeqList.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

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


typedef int DataType;
#define N 100

typedef struct SeqList{
    DataType arr[N]; //数组存储元素最大值为N
    size_t len; //数组当前长度
}SeqList,*pSeqList;

void InitSeqList(pSeqList plist);//初始化顺序表
void PushBack(pSeqList plist, DataType x);//尾插
void PopBack(pSeqList plist);//尾删
void PushFront(pSeqList plist, DataType x);//头插
void PopFront(pSeqList plist);//头删
void Display(pSeqList plist);//遍历
void ReverseSeqList(pSeqList plist);//逆置
void Insert(pSeqList plist, size_t pos, DataType x);//指定位置插入
void Erase(pSeqList plist, size_t pos);//删除指定位置的数据
void Remove(pSeqList plist, DataType x);//删除表中第一个值为x的数据
void RemoveAll(pSeqList plist, DataType x);//删除表中所有值为x的数据
void Bubble_Sort(pSeqList plist);//冒泡排序
void Select_Sort(pSeqList plist);//选择排序
int Binary_Search(pSeqList plist, DataType x);//二分查找

#endif //_SEQLIST_H_

下面是SeqList.c

#include "SeqList.h"
#pragma once

void InitSeqList(pSeqList plist)//初始化顺序表
{
    assert(plist);
    memset(plist->arr, 0, sizeof(DataType)* N);
    plist->len = 0;
}
void PushBack(pSeqList plist, DataType x)//尾插
{
    assert(plist);
    if (plist->len == N)
    {
        printf("SeqList is full! \n");
        return;
    }
        plist->arr[plist->len++] = x;
}

void PopBack(pSeqList plist)//尾删
{
    assert(plist);
    if (plist->len == 0)
    {
        printf("SeqList is empty! \n");
        return;
    }
    else
    {
        plist->arr[plist->len - 1] = 0;
        plist->len--;
    }
}
void PushFront(pSeqList plist, DataType x)//头插
{
    assert(plist);
    if (plist->len == N)
    {
        printf("SeqList is full! \n");
        return;
    }

    int end = plist->len-1;  //最后一个元素的下标
    for (; end >= 0; end--)
    {
        plist->arr[end+1] = plist->arr[end];
    }
        plist->arr[0] = x;
        plist->len++;
}
void PopFront(pSeqList plist) //头删
{
    assert(plist);
    size_t i = 0;
    if (plist->len == 0)
    {
        printf("SeqList is empty! \n");
        return;
    }
        for (i = 1; i < plist->len; i++)
        {
            plist->arr[i - 1] = plist->arr[i];
        }
        plist->len--;
}
void Display(pSeqList plist)//遍历
{
    assert(plist);
    size_t i = 0;
    for (i = 0; i < plist->len; i++)
    {
        printf("%d ",plist->arr[i]);
    }
    printf("\n");
}
void ReverseSeqList(pSeqList plist)//逆置
{
    assert(plist);
    int left = 0;
    int right = plist->len - 1;
    int tmp = 0;
    while (left < right)
    {
        tmp = plist->arr[left];
        plist->arr[left] = plist->arr[right];
        plist->arr[right] = tmp;
        left++;
        right--;
    }
}
void Insert(pSeqList plist, size_t pos, DataType x)//指定位置插入
{
    assert(plist);
    assert(pos < plist->len);

    if (plist->len == N)
    {
        printf("SeqList is full! \n");
        return;
    }
    size_t end = plist->len - 1;
    for (; end >= pos; end--)
    {
        plist->arr[end + 1] = plist->arr[end];
    }
    plist->arr[pos] = x;
    plist->len++;
}
void Erase(pSeqList plist, size_t pos)//删除指定位置的数据
{
    assert(plist);
    assert(pos < plist->len);

    while (pos < plist->len - 1)
    {
        plist->arr[pos] = plist->arr[pos + 1];
        pos++;
    }
    plist->len--;
}

void Remove(pSeqList plist, DataType x)//删除表中第一个值为x的数据
{
    assert(plist);
    size_t  i = 0;
    for (; i < plist->len; i++)
    {
        if (plist->arr[i] == x)
        {
            Erase(plist,i);
            return;
        }
    }
}
void RemoveAll(pSeqList plist, DataType x)//删除表中所有值为x的数据
{
    assert(plist);
    size_t i = 0;
    for (; i < plist->len; i++)
    {
        if (plist->arr[i] == x)
        {
            Erase(plist,i);
            i--;    //必须i--,因为在调用Erase函数时,i下标处元素被删除,后面的元素往前挪了一个格,plist->arr[i]存储的是i+1的元素;
        }           //如果没有i--,for循环会使i+1位置元素没有被遍历到,顺序表的元素减少了一位,遍历到最后一个元素处,会造成越界
    }
}


void Bubble_Sort(pSeqList plist)//冒泡排序
{
    assert(plist);
    size_t i = 0;
    size_t j = 0;
    for (i = 0; i < plist->len; i++)
    {
        for (j = 0; j < plist->len - 1; j++)
        {
            if (plist->arr[j]>plist->arr[j + 1])
            {
                int tmp = plist->arr[j];
                plist->arr[j] = plist->arr[j + 1];
                plist->arr[j + 1] = tmp;
            }
        }
    }

}
void Select_Sort(pSeqList plist)//选择排序
{
    assert(plist);      //就是先找一个最小的(升序),和第一个元素交换,在在剩下的里面找最小的和第二个元素交换,。。。。
    size_t min = 0;
    size_t index = 0;
    size_t pos = 0;
    for (index = 0; index < plist->len-1; index++)
    {
        min = index;
        pos = index + 1;
        //找出最值
        while(pos < plist->len)
        {
            if (plist->arr[pos] < plist->arr[min])
            {
                min = pos;
            }
            pos++;
        }
        //交换
        //Swap(plist->arr[index],plist->arr[min]);
        if (min != index)    //如果最小值的下标和要交换位置的下标不相等,就交换,相等就没必要交换
        {
            DataType tmp = plist->arr[index];
            plist->arr[index] = plist->arr[min];
            plist->arr[min] = tmp;
        }
    }
}

int Binary_Search(pSeqList plist, DataType x)//二分查找
{
    assert(plist);
    int left = 0;
    int right = plist->len - 1;
    int mid = 0;
    int index = 0;
    while (left < right)
    {
        int mid = left + ( (right - left) >> 1);
        if (plist->arr[mid] < x )
        {
            left = mid + 1;
        }
        else if (plist->arr[mid] > x)
        {
            right = mid - 1;
        }
        else
        {
            while ((plist->arr[mid] == x) && (mid >= 0))
            {
                mid--;                               //  [1 2 2 2 3 3 4 5 5 6 7]  比如 查找2,则返回第一个2的下标1
            }
            return mid + 1;
        }
    }
    return -1;
}


void TestSeqList1()
{
    int index;
    SeqList seq;
    pSeqList plist=&seq;
    InitSeqList(plist);
    PushBack(plist, 1);
    PushBack(plist, 1);
    PushBack(plist, 1);
    PushBack(plist, 1);
    PushBack(plist, 1);
    PushBack(plist, 1);
    PushBack(plist, 3);
    PushBack(plist, 2);
    PushBack(plist, 4);
    //PushBack(plist, -1);

    PushBack(plist, 6);
    PushBack(plist, 5);
    PushBack(plist, 9);
    PushBack(plist, 7);
    PushBack(plist, 8);
    /*PopBack(plist);
    PopBack(plist);
    PopBack(plist);
    PopBack(plist);
    PopBack(plist);*/

    PushFront(plist, 7);
    PushFront(plist, 8);
    PushFront(plist, 6);

    Display(plist);

    //RemoveAll(plist,7);
    Erase(plist,5);

    Display(plist);
    //PopFront(plist);
    //PopFront(plist);
    //PopFront(plist);
    //PopFront(plist);

    //ReverseSeqList(plist);

    //Insert(plist, 4, 9);
    //Display(plist);

    //Bubble_Sort(plist);
    //Select_Sort(plist);
    Select_Sort_OP(plist);

    Display(plist);

    /*index = Binary_Search(plist,1);
    printf("%d\n",index);

    Display(plist);*/

    return;
}

接下来是test.c

#define _CRT_SECURE_NO_WARNING 1

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "SeqList.h"

int main()
{
    TestSeqList1();

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40840459/article/details/80004853