线性表基本操作整理

这篇博客详细介绍了使用C++实现线性表的基本操作,包括初始化、删除、清空、判断是否为空、获取长度、查找元素、插入元素和删除元素等功能。代码中通过结构体封装线性表,并提供了相应的函数实现各种操作,如在指定位置插入元素和删除元素。此外,还展示了如何找到元素的前驱和后继。整个实现过程充分考虑了边界条件和内存管理。
摘要由CSDN通过智能技术生成

///为了方便阅读,我直接把注释写在了程序里,如果发现我写的有问题,欢迎各位巨佬指导。

#include<iostream>
using namespace std;
typedef int elemtype;///elemtype就是线性表中的元素类型
///我们暂时把类型设为int
const int maxsize=100;///startsize就是线性表的大小
const int nstep=10;
struct mylist
{
    elemtype *node;///线性表中的数据
    int nsize;///线性表的大小
    int nlength;///线性表的长度
};
void initlist(mylist &l)//初始化线性表
{
    l.node=new elemtype[maxsize];///开辟空间
    ///初始状态没有元素,,大小nsize和长度nlength都赋值为0
    l.nsize=0;
    l.nlength=0;
}
void dellist(mylist &l)//删除已有的线性表
{
    l.nsize=0;
    l.nlength=0;
    delete []l.node;///删除内存。记住,最好delete后面加上[]
    l.node=NULL;///保险,好习惯
}
void clearlist(mylist &l)//清空线性表
{
    l.nlength=0;
    delete[] l.node;
    l.nsize=0;
    l.node=new elemtype[maxsize];
}
bool islistempty(mylist l)//判断线性表是不是空的
{
    return l.nlength;
    /*
    if(l.nlength==0)return 0;
        else return 1;
    */
}
int listlength(mylist l)//返回线性表的长度
{
    return l.nlength;
}
int getelem(mylist l,int x,elemtype &e)//e返回下标为x的元素的值
{
    if(islistempty(l)==0)
        return -1;///如果线性表是空的,就返回-1
    if(x<1||x>l.nlength)
        return -2;///如果所求的位置不在线性表内就返回-2
    e=l.node[x-1];
    return 1;
}
int elemloc(mylist l,int x)//求某个元素值对应的位置,直接返回下标
{
    for(int i=0; i<l.nlength; i++)
    {
        if(l.node[i]==x)
            return i;
    }
    return -1;
}
int priorelem(mylist l,elemtype x,elemtype &pre)//pre返回元素值为x元素的前驱元素
{
    int location=elemloc(l,x);
    if(location==-1)
        return -2;///如果元素x不在线性表内,返回-2
    if(location==0)
        return -1;///如果元素的位置是第一个,没有前驱元素,返回-1
    pre=l.node[location-1];
    return 1;
}
int nextelem(mylist l,elemtype x,elemtype &next)//next返回元素值为x元素的后继元素
{
    int location=elemloc(l,x);
    if(location==-1)
        return -2;///如果元素x不在线性表内,返回-2
    if(location==l.nlength-1)
        return -1;///如果元素的位置是最后一个,没有后继元素,返回-1
    next=l.node[location+1];
    return 1;
}
int listinsert(mylist &l,elemtype x,int loc)//在第loc位插入元素x
{
    if(loc<1||loc>l.nlength)
        return 0;///如果插入的位置不在线性表内,则返回0

    if(l.nlength==l.nsize)///如果超过了最大长度,则要开辟新的内存空间
    {
            elemtype *temp=new elemtype[l.nsize];
        for(int i=0; i<l.nlength; i++)
            temp[i]=l.node[i];
        delete[] l.node;
        l.node=new elemtype[l.nsize+nstep];
        for(int i=0;i<l.nsize;i++)
        {
            l.node[i]=temp[i];
        }
    }
    for(int i=l.nlength;i>=loc;i--)
    {
        l.node[i]=l.node[i-1];
    }
    l.node[loc-1]=x;
    l.nlength++;///插入之后记得把长度加一
    return 1;
}
int listdelete(mylist &l,int loc)//删除第loc位置的元素
{
    if(loc<1||loc>l.nlength)
        return 0;///如果删除的位置不在线性表内,则返回0
    for(int i=loc-1;i<l.nlength-1;i++)
    {
        l.node[i]=l.node[i+1];
    }

    l.nlength--;///删除之后记得把长度减一
    return 1;
}
///type为0表示删除第一个,为1表示全删
int listdeletedata(mylist &l,elemtype x,int type)//删除元素值为x的元素
{
    int flag=0;
    for(int i=0;i<l.nlength;i++)
    {
        if(l.node[i]==x)
        {
            flag=1;
            listdelete(l,i+1);
            i--;///这个是重点,非常容易出错。
            if(type==0)return 1;///return 1表示有元素x,return 0表示没有元素x
        }
    }
    return flag;
    /*if(flag==0)
        return 0;
    else
        return 1;
    */
}
/*
关于线性表的连接有很多种,最基本的就是直接首尾相连,还有就是求A∪B
先省略这一步的实现
void listconnect(mylist l1,mylist l2,&mylist l)
*/
void scan(mylist &l,int n)//输入n个元素
{
    l.nlength=n;
    for(int i=0;i<n;i++)
    {
        cin>>l.node[i];
    }
}
void print(mylist l)//输出线性表中所有的元素
{
    for(int i=0;i<l.nlength;i++)
        cout<<l.node[i]<<' ';
    cout<<endl;
}
int main()
{
    elemtype pre,next;
    mylist List;
    initlist(List);
    scan(List,5);///暂且定为五个元素{1,2,3,4,5}
    print(List);///0
    listinsert(List,6,3);///1
    print(List);
    listdelete(List,4);///2
    print(List);
    listdeletedata(List,6,0);///3
    print(List);
    listinsert(List,5,4);///4
    print(List);
    listdeletedata(List,5,1);///5
    print(List);
    priorelem(List,2,pre);///6
    nextelem(List,2,next);///7
    cout<<pre<<endl;
    cout<<next<<endl;
/*
至于为什么好多函数是int类型
是为了遇到一些不存在或者超出范围时的状况时,
可以判断出来。
*/
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值