顺序表的实现

顺序表是计算机内存中以数组形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式就称之为顺序表。
要实现顺序表呢,首先就要定义结构体变量

#define seqlistmaxsize 1000
typedef char seqtype;
typedef struct seqlist{
    seqtype c[seqlistmaxsiz];
    size_t size;
}seqlist;

接下来我们就要添加上所需要的头文件等,做好我们的准备工作

#pragma once
#define HEADER printf("\n-----------%s----------\n",__FUNCTION__)
#include<stdio.h>
#include<stdlib.h>
seqlist seq;//声明一个顺序表
void seqlist_print(srqlist *seq);//打印函数的声明
void seqlist_init(seqlist *seq);//初始化顺序表
void seqlist_pushback(seqlist *seq,seqtype value);//尾插
void seqlist_popback(seqlist *seq);//尾删
void seqlist_pushhead(seqlist *seq,seqtype value);//头插
void seqlist_pophead(seqlist *seq);//头删
void seqlist_insert(seqlist *seq,size_t pos,seqtype value);//给给定位置插元素
void seqlist_pop(seqlist *seq,size_t pos);//删除指定位置的元素
void seqlist_find(seqlist *seq,seqtype value);//查找某一元素的位置
void seqlist_read(seqlist *seq,size_t pos);//读取给定位置元素是什么
void seqlist_instead(seqlist *seq,size_t pos,seqtype value);用value替换pos位置的元素

做好准备工作后,我门就可以来实现我们的各个功能

首先我们要实现的就是我们的初始化和打印功能

void seqlist_init(seqlist *seq)
{
    if(seq==NULL)
    {
        return;
    }
    seq->size=0;
}
void seqlist_print(seqlist *seq)
{
    if(seq->size==0)
    {
        return;//空顺序表
    }
    size_t i=0;
    for(i=0;i<seq->size;i++)
    {
        printf("[%c] ",seq->c[i]);
    }
    printf("\n");
}

下面实现尾插,尾删操作

void seqlist_pushback(seqlist *seq,seqtype value)
{
    if(seq==NULL)
    {
        return;//顺序表不存在
    }
    if(seq->size>=seqlistmaxsize)
    {
        return;//满了
    }
    else
    {
        seq->c[seq->size]=value;
        ++(seq->size);
    }
}

void seqlist_popback(seqlist *seq)
{
    if(seq==NULL)
    {
        return;//非法输入
    }
    if(seq->size==0)
    {
        return;//空顺序表删不了
    }
    else
    {
        seq->size--;
    }
}

下面我们要实现的是顺序表的头插,头删

void seqlist_pushhead(seqlist *seq,seqtype value)
{
    if(seq==NULL)
    {
        return;//非法输入
    }
    if(seq->size>=seqlistmaxsize)
    {
        return;//满了
    }
    else
    {
        size_t i=seq->size-1;
        for(;i>=0;i--)
        {
            seq->c[i+1]=seq->c[i];
        }
        seq->c[0]=value;
        seq->size++;
    }

}


void seqlist_pophead(seqlist *seq)
{
    if(seq==NULL)
    {
        return;//非法输入
    }
    if(seq->size==0);
    {
        return;//空顺序表,删不了
    }
    else
    {
        size_t i=0;
        for(;i<seq->size-1;i++)
        {
            seq->c[i]=seq->c[i+1];
        }
        seq->size--;
    }

}

下面我们就要提高难度了

接下来进行的就是任意位置插入,任意位置删除

void seqlist_insert(seqlist *seq,seqlist *pos,seqtype value)
{
    if(seq==NULL)
    {
        return;//非法输入
    }
    if(seq->size>=seqlistmaxsize)
    {
        return;//满了
    }
    else
    {
        seq->size++;//先size++和转换元素后size++都是可以的,因为这段内存空间你已经申请了,用多少是自己说了算,后面size++了之后我们才可以看到加进去的元素
        size_t i=seq->size-1;
        for(i=seq->size-1;i>=pos;i--)
        {
            seq->c[i+1]=seq->c[i];
        }
        seq->c[pos]=value;
    }

}


void seqlist_pop(seqlist *seq,seqlist *pos)
{
    if(seq==NULL)
    {
        return;//非法输入
    }
    if(seq->size==0)
    {
        return;//空
    }
    else
    {
        size_t i=seq->size-1;
        for(;i>=pos;i--)
        {
            seq->c[i]=seq->c[i+1];
        }
        seq->size--;
    }
}

下面我们来实现读取某一个位置的元素,查找某一元素的位置

void seqlist_read(seqlist *seq,size_t pos)
{
    if(seq==NULL)
    {
        return;//
    }
    if(seq->size==0)
    {
        return;//空
    }
    printf("[%c] \n",seq->c[pos]);
}


int seqlist_find(seqlist *seq,seqtype value)
{
    if(seq==NULL)
    {
        return;
    }
    if(seq->size==0)
    {
        return;
    }
    size_t i=0;
    for(;i<seq->size;i++)
    {
        if(seq->c[i]==value)
        {
            return i;
        }
    }
    return -1;
}

现在我们需要实现的是删除指定元素和所有指定的元素

void seqlist_remove(seqlist *seq,seqtype value)

{
    if(seq==NULL)
    {
        return;
    }
    if(seq->size==0)
    {
        return;
    }
    seqlist *pos=seqlist_find(seq,value);
    seqlist_pop(seq,pos);
}


void seqlist_removeall(seqlist *seq,seqtype value)

{
    if(seq==NULL)
    {
        return;
    }
    if(seq->size==0)
    {
        return;
    }
    while(1)
    {
    seqlist *pos=seqlist_find(seq,value);
    seqlist_pop(seq,pos);
    }
}

接着我们要实现替换元素的操作

void seqlist_instead(seqlist *seq,seqlist *pos,seqtype value)
{
    if(seq==NULL)
    {
        return;
    }
    if(seq->size==0)
    {
        return;
    }
    else
    {
        seq->c[pos]=value;
    }
}

下面我们终于来到的本次顺序表实现最难的地方

实现冒泡排序和选择排序

void seqlist_bubblesort(seqlist *seq)
{
    if(seq==NULL)
    {
        return;
    }
    if(seq->size==0)
    {
        return;
    }
    else
    {
        size_t i=0;
        size_t j=0;
        for(i=0;i<seq->size-1;i++)
        {
            for(j=0;j<seq->size-1-i;j++)
            {
                if(seq->c[j]>seq->c[j+1])
                {
                    swap(&seq->c[j],&seq->c[j+1]);
                }
            }
        }
    }
}


void seqlist_xuanze(seqlist *seq)
{
    if(seq==NULL)
    {
        return;
    }
    if(seq->size==0)
    {
        return;
    }
    else
    {
        size_t i=0;
        size_t j=0;
        for(i=0;i<seq->size-1;i++)
        {
            for(j=i+1;j<seq->size,j++)
            {
                if(seq->c[i]>seq->c[j])
                {
                    swap(&seq->c[i],&seq->c[j]);
                }
            }
        }
    }
}

很nice,这里基本上就是顺序表的功能实现;
互相学习;如果有错误请指出谢谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值