数据结构 顺序表

程序代码:

SeqList.h文件:

//防止重定义,与下面#endif对应
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
//整个工程所需要的头文件
#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#include <stdlib.h>
#define MAX 10 //顺序表中能存放的元素个数
typedef int DataType;//类型重命名,为了方便修改顺序表中元素的类型,在这改一次就可以,不用每个地方都修改

typedef struct SeqList
{
    DataType data[MAX];
    int sz;
}SeqList, *pSeqList;
//该顺序表实现的所有功能:(对函数进行声明)

//打印
void PrintSeqList(pSeqList pSeq);
//初始化 
void InitSeqList(pSeqList pSeq);
//尾部插入 
void PushBack(pSeqList pSeq, DataType data);
//尾部删除 
void PopBack(pSeqList pSeq);
//头部插入 
void PushFront(pSeqList pSeq, DataType data);
//头部删除 
void PopFront(pSeqList pSeq);
//查找指定元素 
int Find(pSeqList pSeq, DataType data);
//指定位置插入 
void Insert(pSeqList pSeq, int pos, DataType data);
//删除指定位置元素 
void Erase(pSeqList pSeq, int pos);
//删除指定元素 
void Remove(pSeqList pSeq, DataType data);
//删除所有的指定元素 
void RemoveAll(pSeqList pSeq, DataType data);
//返回顺序表的大小 
int Size(pSeqList pSeq);
//判断顺序表是否为空 
int Empty(pSeqList pSeq);
//冒泡排序 
void BubbleSort(pSeqList pSeq);
//选择排序 
void SelectSort(pSeqList pSeq);
//选择排序的优化 
void SelectSortOP(pSeqList pSeq);
//二分查找 
int BinarySearch(pSeqList pSeq, DataType data);
//二分查找递归写法 
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType d);
//与最前面#ifndef相对应
#endif // __SRQLIST_H__

SeqList.c文件(对所有用到的函数进行定义)

//头文件
#define _CRT_SRCURE_NO_WARNINGS 1

#include "SeqList.h"
//初始化
void InitSeqList(pSeqList pSeq)
{
    assert(pSeq != NULL);
    pSeq->sz = 0;
    memset(pSeq->data, 0, sizeof(pSeq->data));
}
//尾部插入
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(const pSeqList pSeq)
{
    assert(pSeq != NULL);

    int i = 0;
    for (i = 0; i < pSeq->sz; i++)
    {
        printf("%d ", pSeq->data[i]);
    }
    printf("\n");
}
//尾部删除
void PopBack(pSeqList pSeq) 
{
    assert(pSeq != NULL);

    if (pSeq->sz == 0)
    {
        printf("顺序表为空,无法删除!\n");
        return;
    }

    pSeq->sz--;
}
//头部插入 
void PushFront(pSeqList pSeq, DataType data)
{
    assert(pSeq != NULL);

    int i = 0;

    if (pSeq->sz == MAX)
    {
        printf("顺序表已满,无法插入!\n");
        return;
    }

    for (i = pSeq->sz; i > 0; i--)
    {
        pSeq->data[i] = pSeq->data[i - 1];
    }

    pSeq->data[0] = data;
    pSeq->sz++;
}
//头部删除 
void PopFront(pSeqList pSeq)
{
    assert(pSeq != NULL);

    int i = 0;

    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)
{
    assert(pSeq != NULL);

    int i = 0;

    if (pSeq->sz == 0)
    {
        return -1;
    }

    for (i = 0; i < pSeq->sz; i++)
    {
        if (pSeq->data[i] == data)
        {
            return i;
        }
    }

    return -1;
}
//指定位置插入
void Insert(pSeqList pSeq, int pos, DataType data)
{
    assert((pSeq != NULL) && pos >= 0 && pos <= pSeq->sz);
    int i = 0;

    if (pSeq->sz == MAX)
    {
        printf("顺序表已满,无法插入!\n");
        return 0;
    }

    for (i = pSeq->sz; i > pos; i--)
    {
        pSeq->data[i] = pSeq->data[i - 1];
    }

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

    int i = 0;

    if (pSeq->sz == 0)
    {
        printf("顺序表为空,无法删除!\n");
        return;
    }

    for (i = pos; i < pSeq->sz - 1; i++)
    {
        pSeq->data[i] = pSeq->data[i + 1];
    }

    pSeq->sz--;
}
//删除指定元素 
void Remove(pSeqList pSeq, DataType data)
{
    assert(pSeq != NULL);

    int i = 0;
    int j = 0;

    if (pSeq->sz == 0)
    {
        printf("顺序表为空,无法删除!\n");
        return;
    }

    for (i = 0; i < pSeq->sz; i++)
    {
        if (pSeq->data[i] == data)
        {
            break;
        }
    }

    if (i == pSeq->sz)
    {
        printf("未找到该元素,无法删除!\n");
        return;
    }

    for (j = i; j < pSeq->sz - 1; j++)
    {
        pSeq->data[j] = pSeq->data[j + 1];
    }

    pSeq->sz--;
}
//删除所有的指定元素 
void RemoveAll(pSeqList pSeq, DataType data)
{
    assert(pSeq != NULL);

    int i = 0;
    int j = 0;

    if (pSeq->sz == 0)
    {
        printf("顺序表为空,无法删除!\n");
        return;
    }

    for (i = 0; i < pSeq->sz; i++)
    {
        if (pSeq->data[i] != data)
        {
            pSeq->data[j] = pSeq->data[i];
            j++;
        }
    }

    pSeq->sz = j;
}
 //返回顺序表的大小
int Size(pSeqList pSeq)
{
    assert(pSeq != NULL);

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

    return pSeq->sz == 0;
}
//排序用到的数组交换
void Swap(DataType* x, DataType* y)
{
    DataType temp = *x;
    *x = *y;
    *y = temp;
}
 //冒泡排序
void BubbleSort(pSeqList pSeq)
{
    assert(pSeq != NULL);

    int i = 0;
    int j = 0;
    int flag = 0;

    for (i = 0; i < pSeq->sz - 1; i++)
    {
        flag = 0;

        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);
                flag = 1;
            }
        }

        if (flag == 0)
        {
            return;
        }
    }
}
//选择排序 
void SelectSort(pSeqList pSeq)
{
    assert(pSeq != NULL);

    int i = 0;
    int j = 0;

    for (i = 0; i < pSeq->sz - 1; i++)
    {
        int temp = 0;

        for (j = 1; j < pSeq->sz - i; j++)
        {
            if (pSeq->data[temp] < pSeq->data[j])
            {
                temp = j;
            }
        }

        if (temp != pSeq->sz - 1 - i)
        {
            Swap(pSeq->data + temp, pSeq->data + pSeq->sz - 1 - i);
        }
    }
}
//选择排序的优化
void SelectSortOP(pSeqList pSeq) 
{
    int i = 0;
    int j = 0;

    assert(pSeq != NULL);

    for (i = 0; i < (pSeq->sz - 1) / 2; i++)
    {
        int temp = i;
        int temp2 = i;

        for (j = i; j < pSeq->sz - i; j++)
        {
            if (pSeq->data[temp] < pSeq->data[j])
            {
                temp = j;
            }

            if (pSeq->data[temp2] > pSeq->data[j])
            {
                temp2 = j;
            }
        }

        if (temp2 != i)
        {
            Swap(pSeq->data + temp2, pSeq->data + i);
        }

        if (temp == i)
        {
            temp = temp2;
        }

        if (temp != j)
        {
            Swap(pSeq->data + temp, pSeq->data + pSeq->sz - i - 1);
        }
    }
}
//二分查找
int BinarySearch(pSeqList pSeq, DataType data) 
{
    assert(pSeq != NULL);

    int left = 0;
    int right = pSeq->sz;
    int mid = 0;

    while (left <= right)
    {
        mid = left + (right - left) / 2;

        if (pSeq->data[mid] < data)
        {
            left = mid + 1;
        }
        else if (pSeq->data[mid] > data)
        {
            right = mid - 1;
        }
        else
        {
            return mid;
        }
    }

    return -1;
}
//二分查找递归写法 
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType data)
{
    assert(pSeq != NULL);

    int mid = left + (right - left) / 2;

    if (left > right)
    {
        return -1;
    }

    if (pSeq->data[mid] < data)
    {
        return BinarySearch_R(pSeq, mid + 1, right, data);
    }
    else if (pSeq->data[mid] > data)
    {
        return BinarySearch_R(pSeq, left, mid - 1, data);
    }
    else
    {
        return mid;
    }
}

test.c文件:(测试文件,检测每个函数是否能达到想要的要求)

//引用头文件
#define _CRT_SRCURE_NO_WARNINGS 1

#include "SeqList.h"
void TestPushBack()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
}

这里写图片描述

void TestPopBack()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    PopBack(&seq);
    PopBack(&seq);
    PopBack(&seq);
    PrintSeqList(&seq);
}

这里写图片描述

void TestPushFront()
{
    SeqList seq;
    InitSeqList(&seq);
    PushFront(&seq, 1);
    PushFront(&seq, 2);
    PushFront(&seq, 3);
    PushFront(&seq, 4);
    PrintSeqList(&seq);
}

这里写图片描述

void TestPopFront()
{
    SeqList seq;
    InitSeqList(&seq);
    PushFront(&seq, 1);
    PushFront(&seq, 2);
    PushFront(&seq, 3);
    PushFront(&seq, 4);
    PrintSeqList(&seq);
    PopFront(&seq);
    PopFront(&seq);
    PopFront(&seq);
    PrintSeqList(&seq);
}

这里写图片描述

void TestFind()
{
    int temp = 0;
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    temp = Find(&seq, 3);

    if (temp == -1)
    {
        printf("未找到!\n");
    }
    else
    {
        printf("找到了,下标为%d\n", temp);
    }
}

这里写图片描述

void TestInsert()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    Insert(&seq, 2, 5);
    PrintSeqList(&seq);
}

这里写图片描述

void TestErase()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    Erase(&seq, 2);
    PrintSeqList(&seq);
}

这里写图片描述

void TestRemove()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    Remove(&seq, 3);
    PrintSeqList(&seq);
}

这里写图片描述

void TestRemoveAll()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 3);
    PushBack(&seq, 1);
    PushBack(&seq, 3);
    PushBack(&seq, 3);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PushBack(&seq, 3);
    PrintSeqList(&seq);
    RemoveAll(&seq, 3);
    PrintSeqList(&seq);
}

这里写图片描述

void TestSize()
{
    int temp = 0;
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    temp = Size(&seq);
    printf("顺序表的大小为:%d\n", temp);
}

这里写图片描述

void TestEmpty()
{
    int temp = 0;
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PrintSeqList(&seq);

    temp = Empty(&seq);
    if (temp == 1)
    {
        printf("顺序表为空!\n");
    }
    else
    {
        printf("顺序表不为空\n");
    }
}

这里写图片描述

void TestBubbleSort()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 6);
    PushBack(&seq, 7);
    PushBack(&seq, 5);
    PushBack(&seq, 3);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    BubbleSort(&seq);
    PrintSeqList(&seq);
}

这里写图片描述

void TestSelectSort()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 6);
    PushBack(&seq, 7);
    PushBack(&seq, 5);
    PushBack(&seq, 3);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    SelectSort(&seq);
    PrintSeqList(&seq);
}

这里写图片描述

void TestSelectSortOP()
{
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 6);
    PushBack(&seq, 7);
    PushBack(&seq, 5);
    PushBack(&seq, 3);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 4);
    PrintSeqList(&seq);
    SelectSortOP(&seq);
    PrintSeqList(&seq);
}

这里写图片描述

void TestBinarySearch()
{
    int temp = 0;
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PushBack(&seq, 5);
    PushBack(&seq, 6);
    PushBack(&seq, 7);
    PushBack(&seq, 8);
    PrintSeqList(&seq);
    temp = BinarySearch(&seq, 5);

    if (temp == -1)
    {
        printf("未找到该元素!\n");
    }
    else
    {
        printf("找到了,下标为:%d\n", temp);
    }
}

这里写图片描述

void TestBinarySearch_R()
{
    int temp = 0;
    SeqList seq;
    InitSeqList(&seq);
    PushBack(&seq, 1);
    PushBack(&seq, 2);
    PushBack(&seq, 3);
    PushBack(&seq, 4);
    PushBack(&seq, 5);
    PushBack(&seq, 6);
    PushBack(&seq, 7);
    PushBack(&seq, 8);
    PrintSeqList(&seq);
    temp = BinarySearch_R(&seq, 0, seq.sz - 1, 7);

    if (temp == -1)
    {
        printf("未找到该元素!\n");
    }
    else
    {
        printf("找到了,下标为:%d\n", temp);
    }
}

这里写图片描述

//主函数,分别调用每个测试文件
int main()
{
    //TestPushBack();
    //TestPopBack();
    //TestPushFront();
    //TestPopFront();
    //TestFind();
    //TestInsert();
    //TestErase();
    //TestRemove();
    //TestRemoveAll();
    //TestSize();
    //TestEmpty();
    //TestBubbleSort();
    //TestSelectSort();
    //TestSelectSortOP();
    //TestBinarySearch();
    //TestBinarySearch_R();

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/K_A_Irving/article/details/80732287