数据结构之线性表(C++实现)

线性表的特点

  • 存在唯一的一个被称作“第一个”的数据元素
  • 存在唯一的一个被称作“最后一个”的数据元素
  • 除第一个外,集合中的每个数据元素均只有一个前驱
  • 除最后一个元素外,集合中的每个数据元素均只有一个后继

线性表的基本操作

  • InitList(&L); 构造空的线性表L
  • DestoryList(&L); 销毁已有线性表L
  • ListEmpty(L); 判断线性表L是否为空,返回T/F
  • ListLength(L); 求线性表L中的元素个数
  • ClearList(&L); 将已有线性表L置为空表
  • GetElem(L,i,&e); 用e返回线性表L中第i个元素值
  • LocateElem(L,e); 用线性表L中查找元素e的位置
  • PriorElem(L,cur_e,&pre_e); 用pre_e返回线性表L中元素cur_e的前驱元素
  • NextElem(L,cur_e,&next_e); 用next_e返回线性表中元素cur_e的后继元素
  • ListInsert(&L,i,e); 在线性表L的第i个元素之前插入e
  • ListDelete(&L,i,&e); 删除线性表L中的第i个元素
  • PutElem(&L,i,&e); 将线性表L中第i个元素赋值为e

操作的实现

顺序表的实现

#include<iostream>
using namespace std;
class SqlList
{
private:
    int *Head;    //顺序表的首地址
    int length;   //实际长度,从1开始
    int Maxsize;    //最大长度,超过这个数就要扩展申请的内存空间
public:
    SqlList(int N);
    ~SqlList();
    void InitList();   //初始化线性表
    bool ListEmpty();   //是否为空
    int ListLength();   //线性表长度
    int GetElem(int L);   //获取某个位置的值
    int Locate(int Elem);    //某个值的位置
    int Insert(int L,int Elem);  //插入
    int Delete(int L);    //删除
};

SqlList::SqlList(int N)
{
    Maxsize=N;
    length=0;
    Head=(int*)malloc(N*sizeof(int));    //申请一块内存
}
SqlList::~SqlList()
{
    free(Head);
    Maxsize=0;
    length=0;
}
void SqlList::InitList()
{
    cout<<"请输入所有的数值"<<endl;
    for(int i=0;i<Maxsize;i++)
    {
        int value;
        cin>>value;
        if(value==-1)
        {
            break;
        }
        *(Head+i)=value;
        length++;
    }
}

bool SqlList::ListEmpty()
{
    if(!length)
    {
        return true;
    }
    else {
        return false;
    }
}

int SqlList::ListLength()
{
    return length;
}
int SqlList::GetElem(int L)
{
    if(L<1||L>length)
    {
        cout<<"位置不合法"<<endl;
        return -1;
    }
    return *(Head+L-1);
}
int SqlList::Locate(int Elem)
{
    for(int i=0;i<length;i++)
    {
        if(Elem==*(Head+i))
        {
            return i+1;
        }
    }
    cout<<"无法找到该元素"<<endl;
    return -1;
}

int SqlList::Delete(int L)
{
    int elem;
    if(length==0)
    {
        cout<<"数组下溢"<<endl;
        return -1;
    }
    if(L<1||L>length)
    {
        cout<<"位置不合法"<<endl;
        return -1;
    }
    elem=*(Head+L-1);
    for(int j=L-1;j<length-1;j++)
    {
        *(Head+j)=*(Head+j+1);
    }
    length--;
    return  elem;
}

int SqlList::Insert(int L, int Elem)
{
    if(length>=Maxsize)
    {
        Head=(int*)realloc(Head,Maxsize*2*sizeof (int));
        Maxsize+=Maxsize;
    }
    if(L<1||L>length+1)
    {
        cout<<"位置错误,无法插入"<<endl;
        return -1;
    }
    if(L!=length+1)
    {
        for(int i=length-1;i>=L-1;i--)
        {
            *(Head+i+1)=*(Head+i);
        }
    }
    *(Head+L-1)=Elem;
    length++;
    return 0;
}
int main()
{
    SqlList list(50);
    list.InitList();
    bool isempty=list.ListEmpty();
    cout<<isempty<<endl;
    int elem=list.GetElem(3);
    cout<<elem<<endl;
    int location=list.Locate(32);
    cout<<location<<endl;
    int delelem=list.Delete(8);
    cout<<delelem<<endl;
    int length=list.ListLength();
    cout<<length<<endl;
    list.Insert(3,45);
    int elem1=list.GetElem(3);
    cout<<elem1<<endl;
    system("pause");
    return 0;
}

链表的实现

#include<iostream>
using namespace std;

template<class DataType>
struct Node
{
    DataType data;
    Node<DataType> *next;
};

template<class DataType>
class LinkList
{
public:
    LinkList();
    LinkList(DataType a[],int n);
    ~LinkList();
    int Length();
    DataType Get(int i);
    int Locate(DataType x);
    void Insert(int i,DataType x);
    DataType Delete(int i);
    void PrintList();

private:
    Node<DataType>*first;
};

template<class DataType>
LinkList<DataType>::LinkList()
{
    first=new Node<DataType>;
    first->next=nullptr;
}
template<class DataType>
LinkList<DataType>::LinkList(DataType a[] ,int n)
{
    first=new Node<DataType>;
    first->next=NULL;
    for(int i=0;i<n;i++)
    {
        Node<DataType> *s=new Node<DataType>;
        s->data=a[i];
        //头插法
        s->next=first->next;
        first->next=s;
    }
}

template<class DataType>
LinkList<DataType>::~LinkList<DataType>()
{
    while (first != nullptr)
    {
        Node<DataType>* q = first;
        first = first->next;
        delete q;
    }
}


template<class DataType>
int LinkList<DataType>::Length()
{
    Node<DataType>* p=first->next;
    int count=0;
    while (p!=nullptr)
    {
       p=p->next;
       count++;
    }
    return count;
}

template<class DataType>
DataType LinkList<DataType>::Get(int i)
{
    Node<DataType> *p= first->next;
    int count=1;
    while (p!=nullptr&&count<i)
    {
        p=p->next;
        count++;
    }
    if(p==nullptr||count>i)
        throw "Location out of range";
    else
        return  p->data;

}

template<class DataType>
int LinkList<DataType>::Locate(DataType x)
{
    Node<DataType> *p=first->next;
    int count=1;
    while(p!=nullptr)
    {
        if(p->data==x)
            return count;
        p=p->next;
        count++;
    }
    return 0;
}

//在第i个结点位置之前插入新的数据元素x
template<class DataType>
void LinkList<DataType>::Insert(int i,DataType x)
{
    Node<DataType> *p=first;
    int count=0;
    while (p!=nullptr&&count<i-1)  /*寻找第i-1个结点*/
    {
       p=p->next;
       count++;
    }
    if(p==nullptr||count>i-1)
        throw  "out of range";
    else
    {
        Node<DataType> *s=new Node<DataType>;
        s->data=x;
        s->next=p->next;
        p->next=s;
    }
}

template<class DataType>
DataType LinkList<DataType>::Delete(int i)
{
    Node<DataType> *p=first;
    int count=0;
    while (p!=nullptr&&count<i-1)
    {
        p=p->next;
        count++;
    }
    if(p==nullptr||count>i-1)
        throw "out of range";
    else if(p->next==nullptr)
        throw "Empty LinkList";
    else
    {
        Node<DataType> *q=p->next;
        int x=q->data;
        p->next=q->next;
        return x;
    }
}

template<class DataType>
void LinkList<DataType>::PrintList()
{
    Node<DataType> *p=first->next;
    while (p!=nullptr)
    {
        cout<<p->data<<endl;
        p=p->next;
    }
}
int main()
{
    LinkList<int> p;
    p.Insert(1,6);
    p.Insert(2,9);
    p.PrintList();
    p.Insert(2,3);
    p.PrintList();
    cout<<p.Get(2)<<endl;
    cout<<p.Locate(9)<<endl;
    cout<<p.Length()<<endl;
    p.Delete(1);
    p.PrintList();
    //system("pause");
    return 0;
}

参考链接:https://blog.csdn.net/sjhdxpz/article/details/81023263
https://blog.csdn.net/qq_30611601/article/details/79516986

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值