静态顺序表

顺序表是一个线性表,它是由一段连续的存储单元来依次存储数据元素的线性结构。
这里写图片描述

下面是代码和一些难点解释

.h文件

#pragma once

#ifndef _Seqlist_H_
#define _Seqlist_H_

#include <tchar.h>
#define MAX 10
typedef int Typedata;

typedef struct Seqlist
{
    size_t size;
    Typedata arr[MAX];
}Seq;

void test(Seq* p);
void Init_Seqlist(Seq* pSeq);//初始化
void PushBack_Seqlist(Seq* pSeq, Typedata data);//尾插
void PopBack_Seqlist(Seq* pSeq);//尾删
int Empty(Seq* pSeq);//判空
void PushFront_Seqlist(Seq* pSeq, Typedata data);//头插
void PopFront_Seqlist(Seq* pSeq);//头删
void EraseInser_Seqlist(Seq* pSeq, int pos, Typedata data);//任意位置插入
void ErasePop_Seqlist(Seq* pSeq, int pos);//任意位置删除
int Search_Seqlist(Seq* pSeq, Typedata data);//在顺序表中查找
void Del_FirstData(Seq* pSeq, Typedata data);//删除第一个值为data的数据
void Del_AllData(Seq* pSeq, Typedata data);//删除所有值为data的数据
void Sort_Seqlist(Seq* pSeq);//排序(选择排序)

#endif//_Seqlist_H_

.c文件

#include"Seqlist.h"
#include<stdio.h>
#include<assert.h>

//初始化
void Init_Seqlist(Seq *pSeq)
{
    assert(pSeq);
    pSeq->size = 0;
}

void PushBack_Seqlist(Seq* pSeq, Typedata data)//尾插
{
    assert(pSeq);
    if (pSeq->size >= MAX){
        printf("Full of Seqlist \n");
        return;
    }
    pSeq->arr[pSeq->size] = data;
    pSeq->size++;
}

int Empty_Seqlist(Seq* pSeq)//判空
{
    assert(pSeq);
    return pSeq->size == 0;
}

void PopBack_Seqlist(Seq* pSeq)//尾删
{
    int i = 0;
    assert(pSeq);
    if (Empty_Seqlist(pSeq)){
        printf("Seqlist is empty!\n");
        return;
    }
    pSeq->size--;
}

void PushFront_Seqlist(Seq* pSeq, Typedata data)//头插
{
    int i = 0;
    assert(pSeq);
    i = pSeq->size;
    if (pSeq->size >= MAX){
        printf("Full of Seqlist \n");
        return;
    }

    for (i; i >= 0; --i)
        pSeq->arr[i - 1] = pSeq->arr[i];
    pSeq->arr[0] = data;
    pSeq->size++;
}

void PopFront_Seqlist(Seq* pSeq)//头删
{
    assert(pSeq);
    if (Empty_Seqlist(pSeq)){
        printf("Seqlist is empty!\n");
        return;
    }

    for (size_t i = 1; i < pSeq->size; ++i)
        pSeq->arr[i - 1] = pSeq->arr[i];
    pSeq->size--;
}

void EraseInser_Seqlist(Seq* pSeq, int pos, Typedata data)//任意位置插入
{
    assert(pSeq);
    int i = pSeq->size;//必须要在断言之后,因为断言前还不知道结构体存不存在
    if (pSeq->size >= MAX){
        printf("Full of Seqlist \n");   
        return;
    }
    if ((pos >= pSeq->size) || (pos < 0)){
        printf("wrong pos\n");
        return;
    }


    for (i; i >= pos; --i)
        pSeq->arr[i] = pSeq->arr[i - 1];//搬移元素
    pSeq->arr[pos] = data;//将data插入到要插入的位置

    pSeq->size++;
}

void ErasePop_Seqlist(Seq* pSeq, int pos)//任意位置删除
{
    assert(pSeq);
    int i = pos;
    if (Empty_Seqlist(pSeq)){
        printf("Seqlist is empty!\n");
        return;
    }
    if ((pos >= pSeq->size) || (pos < 0)){
        printf("wrong pos\n");
        return;
    }

    for (i; i < pSeq->size; ++i)
        pSeq->arr[i] = pSeq->arr[i+1];//搬移元素

    pSeq->size--;
}

int Search_Seqlist(Seq* pSeq, Typedata data)///查询
{
    assert(pSeq);
    size_t i = 0;
    while (i < pSeq->size){
        if (pSeq->arr[i] == data)
            return i;
        ++i;
    }
    return -1;
}

void Del_FirstData(Seq* pSeq, Typedata data)//删除第一个为data的值
{
    ErasePop_Seqlist(pSeq, Search_Seqlist(pSeq, data));
}

void Del_AllData(Seq* pSeq, Typedata data)//删除所有值为data的数据
{
    assert(pSeq);
    int i = 0;
    int count = 0;
    for (i; i < pSeq->size; ++i){
        if (pSeq->arr[i] != data)
            //如有连续count个值为data的数据,则将后面不为data的数往前移count位,一次性删除
            pSeq->arr[i - count] = pSeq->arr[i];
        else
            count++;
    }
    pSeq->size - count;
}

void Sort_Seqlist(Seq* pSeq)//排序(选择排序)
{
    assert(pSeq);

    int begin = 0;
    int end = pSeq->size - 1;//设置前后两个标签,分别指向最前面和最后的值

    while (begin < end)
    {
        int MaxPos = begin;
        int MinPos = begin;
        int i = begin + 1;
        while (i < end)
        {
            if (pSeq->arr[i]>pSeq->arr[MaxPos])
                MaxPos = i;
            if (pSeq->arr[i] < pSeq->arr[MinPos])
                MinPos = i;
            ++i;
        }
        if (MaxPos != end){            //将最大值放到最后
            Typedata temp = pSeq->arr[end];
            pSeq->arr[end] = pSeq->arr[MaxPos];
            pSeq->arr[MaxPos] = temp;
        }
        if (MinPos != begin){         //将最小的值放到最前
            Typedata temp = pSeq->arr[begin];
            pSeq->arr[begin] = pSeq->arr[MinPos];
            pSeq->arr[MinPos] = temp;
        }

        ++begin;//begin标签往后移
        --end;//end标签往前移
    }
}

void test(Seq* p)
{
    Init_Seqlist(p);
    PushBack_Seqlist(p, 6);
    PushBack_Seqlist(p, 1);
    PushBack_Seqlist(p, 2);
    PushBack_Seqlist(p, 2);
    PushBack_Seqlist(p, 4);
    PushBack_Seqlist(p, 7);
    PushBack_Seqlist(p, 3);
/*  
    PushBack_Seqlist(p, 7);
    PushBack_Seqlist(p, 9);
    PushBack_Seqlist(p, 10);
    PushBack_Seqlist(p, 11);//尾插直到此行结束
    PopBack_Seqlist(p);
    PopBack_Seqlist(p);
    PopBack_Seqlist(p);
    PopBack_Seqlist(p);//尾删到此行结束
    PushFront_Seqlist(p, 1);
    PushFront_Seqlist(p, 2);
    PushFront_Seqlist(p, 3);
    PushFront_Seqlist(p, 4);
    PushFront_Seqlist(p, 5);//头插到此行结束
    PopFront_Seqlist(p);
    PopFront_Seqlist(p);
    PopFront_Seqlist(p);//头删到此结束   
    EraseInser_Seqlist(p, 3, 6);
    EraseInser_Seqlist(p, 2, 8);
    EraseInser_Seqlist(p, 5, 0);
    EraseInser_Seqlist(p, 12, 1);//任意位置插入到此行结束
    ErasePop_Seqlist(p, 7);
    ErasePop_Seqlist(p, 0);
    ErasePop_Seqlist(p, 4); //任意位置删除到此行结束
    int Pos_Seachr = Search_Seqlist(p, 4); //查询
    Del_FirstData(p, 2);//删除第一个值为data的数据
    Del_AllData(p, 2);//删除所有为data的值       
    */
    Sort_Seqlist(p);//排序
}
int main()
{
    Seq seqlist;
    Seq* pseq = &seqlist;

    test(pseq);
    return 0;
}

这里写图片描述

此处删除所有元素为data的数据用的是上图中c方法;a方法时间复杂度太大;b方法利用空间换时间,不太理想;c方法相对前两个方法来说比较巧妙。

以下是解析排序:

“`
void Sort_Seqlist(Seq* pSeq)//排序(选择排序)
{
assert(pSeq);

int begin = 0;
int end = pSeq->size - 1;//设置前后两个标签,分别指向最前面和最后的值

while (begin < end)
{
    int MaxPos = begin;
    int MinPos = begin;
    int i = begin + 1;
    while (i < end)
    {
        if (pSeq->arr[i]>pSeq->arr[MaxPos])
            MaxPos = i;
        if (pSeq->arr[i] < pSeq->arr[MinPos])
            MinPos = i;
        ++i;
    }
    if (MaxPos != end){            //将最大值放到最后
        Typedata temp = pSeq->arr[end];
        pSeq->arr[end] = pSeq->arr[MaxPos];
        pSeq->arr[MaxPos] = temp;
    }
    if (MinPos != begin){         //将最小的值放到最前
        Typedata temp = pSeq->arr[begin];
        pSeq->arr[begin] = pSeq->arr[MinPos];
        pSeq->arr[MinPos] = temp;
    }

    ++begin;//begin标签往后移
    --end;//end标签往前移
}

}
“`这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值