c语言 顺序表

头文件
#ifndef SEQ_LIST
#define SEQ_LIST
#include <stdio.h>


typedef int DataType;
#define  MAX_SIZE  10


typedef struct SeqList
{
    DataType arry[MAX_SIZE];
    size_t Size;
}SeqList, *PSeqList;
#endif
源文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "SeqList.h"

// 初始化顺序表
void InitSeqList(SeqList* seqList)
{
    /*for (int iBegin = 0; iBegin < MAX_SIZE; iBegin++)
        seqList->arry[iBegin] = 0;*/
    memset(seqList->arry,0,MAX_SIZE*sizeof(DataType));
    seqList->Size = 0;
}

// 在顺序表的尾部插入元素data
void PushBack(SeqList* seqList, DataType data)
{
    assert(seqList);
    if (seqList->Size > MAX_SIZE)
    {
        printf("顺序表中已满,请删除后再插入元素");
        return;
    }
    seqList->arry[seqList->Size] = data;
    seqList->Size++;
}

// 将顺序表尾部的元素抛出
void PopBack(SeqList* seqList)
{
    assert(seqList);
    if (seqList->Size == 0)
    {
        printf("顺序表为空,请插入元素后再删除");
        return;
    }
    seqList->Size--;
}

// 顺序表的头部插入元素data
void PushFront(SeqList* pSeqList, DataType data)
{
    int iBegin = 0;
    assert(pSeqList);
    if (pSeqList->Size == MAX_SIZE)
    {
        printf("顺序表已满,现插入会覆盖最后一个数据");
        for (iBegin = pSeqList->Size - 1 ; iBegin > 0; iBegin--)
        {
            pSeqList->arry[iBegin] = pSeqList->arry[iBegin - 1];
        }
        pSeqList->arry[0] = data; 
        return;
    }
    else
    {
        for (iBegin = pSeqList->Size ; iBegin >= 0; iBegin--)
        {
            pSeqList->arry[iBegin + 1] = pSeqList->arry[iBegin ];
        }
        pSeqList->arry[0] = data;
    }
    pSeqList->Size++;
}

// 顺序表的头部的元素删除
void PopFront(SeqList* pSeqList)
{
    int iBegin = 0;
    assert(pSeqList);
    if (pSeqList->Size == 0)
    {
        printf("该顺序表为空,请插入元素后再删除元素");
        return;
    }
    for (; iBegin <= pSeqList->Size - 1; iBegin++)
    {
        pSeqList->arry[iBegin] = pSeqList->arry[iBegin + 1];
    }
    pSeqList->Size--;
}

// 顺序表中查找数据data,返回该元素在顺序表中的位置
int Find(SeqList* pSeqList, DataType data)
{
    int ipos = 0;
    //int iBegin = 0;
    assert(pSeqList);
    if (pSeqList->Size == 0)
    {
        printf("该顺序表为空");
        return 0;
    }
    for (; ipos < pSeqList->Size - 1; ipos++)
    {
        if (pSeqList->arry[ipos] == data)
        {
            return (ipos + 1);
        }
    }
    printf("没有找到该元素");
    return 0;
}

// 在顺序表的ipos位置上插入元素data
void Insert(SeqList* pSeqList, size_t pos, DataType data)
{
    int iBegin = 0;
    assert(pSeqList);
    if (pos > MAX_SIZE)
    {
        printf("所输入位置超出了顺序表范围,请重新输入\n");
        return;
    }
    if (pSeqList->Size == MAX_SIZE)
    {
        printf("顺序表元素已满,插入操作会丢失一个元素\n");
        for (iBegin = pSeqList->Size - 1; iBegin >= pos - 1; iBegin--)
        {
            pSeqList->arry[iBegin + 1] = pSeqList->arry[iBegin];
        }
        pSeqList->arry[pos - 1] = data;
        return;
    }
    else if ( pos <= pSeqList->Size )
    {
        for (iBegin = pSeqList->Size ; iBegin > pos - 1; iBegin--)
        {
            pSeqList->arry[iBegin ] = pSeqList->arry[iBegin - 1];
        }
        pSeqList->arry[pos - 1] = data;
    }
    else
    {
        printf("输入位置不合法\n");
        return;
    }
    pSeqList->Size++;
}

// 删除顺序表pos位置上的元素
void Erase(SeqList* pSeqList, size_t pos)
{
    int iBegin = 0;
    assert(pSeqList);
    if (pos > pSeqList->Size)
    {
        printf("输入位置超过顺序表范围\n");
        return;
    }
    if (pSeqList->Size == 0)
    {
        printf("顺序表为空,请先插入元素再删除元素\n");
        return;
    }
    for (iBegin = pos - 1; iBegin < pSeqList->Size; iBegin++)
    {
        pSeqList->arry[iBegin] = pSeqList->arry[iBegin + 1];
    }
    pSeqList->Size--;
}

// 移除顺序表中的元素data
void Remove(SeqList* pSeqList, DataType data)
{
    int iBegin = 0;
    int ipos = 0;
    assert(pSeqList);
    if (pSeqList->Size == 0)
    {
        printf("顺序表为空,请先插入元素再删除元素\n");
        return;
    }
    for (; iBegin < pSeqList->Size; iBegin++)
    {
        if (pSeqList->arry[iBegin] == data)
        {
            for (ipos = iBegin; ipos < pSeqList->Size; ipos++)
            {
                pSeqList->arry[ipos] = pSeqList->arry[ipos + 1];
            }
            pSeqList->Size--;
            return;
        }
    }
    printf("该顺序表中没有值为%d的元素", data);
}

// 移除顺序表中的所有值为data的元素
void RemoveAll(SeqList* pSeqList, DataType data)
{
    int iBegin = 0;
    int iCount = 0;
    assert(pSeqList);
    if (pSeqList->Size == 0)
    {
        printf("顺序表为空,请先插入元素再删除元素\n");
        return;
    }
    for (; iBegin < pSeqList->Size; iBegin++)
    {
        if (pSeqList->arry[iBegin] == data)
        {
            iCount++;
        }
        else
        {
            if (iCount == 0)
            {

            }
            else
            {
                pSeqList->arry[iBegin - iCount] = pSeqList->arry[iBegin];
            }
        }
    }
    pSeqList->Size -= iCount;
}

// 选择排序
void SelectSort(SeqList* pSeqList)
{
    int iIn = 0;
    int iOut = 0;
    int iCount = 0;
    int iMaxPos = 0;
    int iMinPos = 0;
    int tempMax = pSeqList->arry[0];
    int tempMin = pSeqList->arry[0];

    for (; iOut < pSeqList->Size/2 + 1; iOut++)
    {
        tempMax = pSeqList->arry[iCount];
        tempMin = pSeqList->arry[iCount];
        for (iIn = iCount; iIn < pSeqList->Size - iCount; iIn++)
        {
            if (pSeqList->arry[iIn] >= tempMax)
            {
                tempMax = pSeqList->arry[iIn];
                iMaxPos = iIn;
            }
            if (pSeqList->arry[iIn] <= tempMin)
            {
                tempMin = pSeqList->arry[iIn];
                iMinPos = iIn;
            }
        }
        tempMin = pSeqList->arry[iCount];
        pSeqList->arry[iCount] = pSeqList->arry[iMinPos];
        pSeqList->arry[iMinPos] = tempMin;
        tempMax = pSeqList->arry[pSeqList->Size - iCount - 1];
        pSeqList->arry[pSeqList->Size - iCount - 1 ] = pSeqList->arry[iMaxPos];
        pSeqList ->arry[iMaxPos] = tempMax;
        iCount++;
    }
}

// 冒泡排序
void BorbbleSort(SeqList* pSeqList)
{
    int iIn = 0;
    int iOut = 0;
    int temp = 0;
    int iCount = 0;
    int iFlag = 0;
    for (; iOut < pSeqList->Size; iOut++)
    {
        iFlag = 0;
        iCount++;
        for (iIn = 0; iIn < pSeqList->Size - iCount; iIn++)
        {
            if (pSeqList->arry[iIn] > pSeqList->arry[iIn + 1])
            {
                temp = pSeqList->arry[iIn];
                pSeqList->arry[iIn] = pSeqList->arry[iIn + 1];
                pSeqList->arry[iIn + 1] = temp;
                iFlag = 1;
            }
            else;
        }
        if (iFlag == 0)
            return;
    }
}

// 查找已序顺序表中的元素data
//升序
int BinarySearch(SeqList* pSeqList, DataType data)
{
    int iBegin = 0;
    int iLeft = 0;
    int iRight = pSeqList->Size ;
    int iMid = 0;
    int iFlag = 1;
    assert(pSeqList);
    if (pSeqList->Size == 0)
    {
        printf("该顺序表为空\n");
        return;
    }
    if ( data > pSeqList->arry[iRight - 1] )
        {
            printf("没有这个元素");
            return -1;
        }
    while ( iFlag )
    {
        iMid = iLeft + (iRight - iLeft) / 2;    //会考数据溢出
        //当ileft,iright很大时,(ileft+iright)/2会溢出int范围
        if (pSeqList->arry[iMid] > data)
            iRight = iMid + 1;
        else if (pSeqList->arry[iMid] < data)
            iLeft = iMid ;
        else
        {
            iFlag = 0;
            return iMid + 1;
        }
    }
    return 0;
}

// 打印顺序表
void PrintSeqList(SeqList* pSeqList)
{
    int iBegin = 0;
    assert(pSeqList);
    if (pSeqList->Size == 0)
    {
        printf("顺序表为空\n");
        return;
    }
    for (; iBegin < pSeqList->Size; iBegin++)
    {
        printf("%d \t", pSeqList->arry[iBegin]);
    }
    printf("\n");
}
int main()
{
    void InitSeqList(seqList);
	void PrintSeqList( pSeqList);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mashui21/article/details/80694572