线性表的特点
- 存在唯一的一个被称作“第一个”的数据元素
- 存在唯一的一个被称作“最后一个”的数据元素
- 除第一个外,集合中的每个数据元素均只有一个前驱
- 除最后一个元素外,集合中的每个数据元素均只有一个后继
线性表的基本操作
- 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