第一章——线性表
1.1——顺序表
1.1.1——顺序表的存储结构(顺序存储结构)
特点:
逻辑与物理一致:逻辑上相邻则,物理存储空间上也相邻
便于存取:可以通过下方公式来计算出数据被存放的位置
1.1.2——顺序表的类型定义
SqList.h
template<class ElemType>
class SqList
{
private:
/* data */
int length;
int MaxLength;
ElemType *data;//这里的data是一个指向ElemType型数据的指针,用指针的原因
//是通过使用指针,SqList 类可以动态地分配内存,并根据需要扩展或缩小数组
public:
/*functions*/
SqList(){length=0;}//无参构造函数
SqList(ElemType data[],int n);//含参构造,将a[]的前n项输入进入顺序表
SqList(int length);
~SqList();//这是析构函数,主要目的是在对象销毁时释放对象所占用的资源,例如动态分配的内存等。
void InsElem(int i,ElemType e)
// 在位置i插入元素e
void DelElem(int i);
// 删除位置i的元素
void DelElem(ElemType e);
// 删除元素e
int Getlength();
// 返回元素个数
ElemType GetElem(int i);
// 返回元素
void DispList( );
//按序号依次输出各元素
void Clear(){ length=0; }
//清空顺序表
};
SqList.cpp
#include <iostream>
using namespace std;
#include "SqList.h"
#define N 100
template <class ElemType>
SqList <ElemType>::SqList(ElemType a[], int n) //有参构造函数
{
MaxLen = N;
if(n>MaxLen) throw "参数非法";
data=new ElemType[MaxLen+1]; //空置下标为0的元素不用
for (int i=1;i<=n;i++)
data[i]=a[i-1];
length=n;
}
//初始化顺序表最大长度为参数n
template <class ElemType>
SqList <ElemType>::SqList(int n){
MaxLen=n;
data=new ElemType[MaxLen+1]; //空置下标为0的元素不用
length=0;
}
/*查找第i个位置上的元素*/
template <class ElemType>
ElemType SqList <ElemType>::GetElem(int i)
{
if(i<1||i>length) cout<<"Error"<<endl;
else return data[i];
}
/*输出一个线性表*/
template <class ElemType>
void SqList <ElemType>::DispList( )
{
int i;
for(i=1;i<=length;i++)
cout<<data[i]<<" " ;
cout<<endl;
}
/*在线性表中查找元素值为x的元素*/
template <class ElemType>
int SqList <ElemType>::Locate(ElemType x)
{
int i=1;
while(i<=length && data[i]!=x)
i++;
if(i<=length)
return i ;
else return 0;
}
//插入元素x
template <class ElemType>
void SqList<ElemType>::InsElem(int i,ElemType x)
{
if(length==MaxLen) throw "上溢!" ;
if (i<1 || i>length+1) throw "位置非法";
for(int j=length; j>=i; j--)
data[j+1]=data[j]; //数据元素后移
data[i]=x; //插入x
length++; //表长度加1
}
/*删除指定位置的线性表元素*/
template <class ElemType>
ElemType SqList <ElemType>::DelElem(int i) //删除线性表中第i个位置上的元素
{
ElemType e;
if(length==0) throw "下溢!" ;
if(i<1|| i>length) throw "位置非法!" ;
e=data[i];
for(int j=i+1; j<=length; j++)
data[j-1]=data[j];
length--;
return e;
}
/*在线性表中删除指定元素值*/
template <class ElemType>
int SqList<ElemType>::DelElem2(ElemType x)
{
int i,j;
for(i=1;i<=length;i++)
if(x==data[i])
break;
if(i<=length){
for(j=i+1;j<=length;j++)
data[j-1]=data[j];
length--;
return i;
}
else return 0;
}
1.2——链表
1.2.1链表的存储结构
特点:
存储密度:每一个结点都是由数据域与指针域来组成的,因此他们的存储密度不可能是1
逻辑与物理不一致:链表的存储顺序是使用指针来完成的,因此不能以数据的存储位置来当作他们的逻辑上的位置
1、单向链表
特点: 只有一个指针域next只能指向下一个结点
2、双向链表
特点: 有两个指针域prior,next分别指向上一个结点和下一个结点
3、循环链表
特点:尾结点不再是NULL,而是指向头结点
第二章——栈和队列
第三章——串![](https://img-blog.csdnimg.cn/ab914f6afd7a46bd93d31e1c4fab52f0.png)
串是一种以字符为数据元素的特殊线性表,他的数据对象是字符集合
4.1串的基本运算
4.1.1——串的基本运算
Strassign(s,chars)
功能:赋值运算。将串常量chars赋给串变量s
例如:执行Strassign(s,”acsd”),s的值变为“acsd”
Assign(s,t)
功能:赋值运算。将串变量t赋给串变量s
例如:t=“qqq”执行Assign(s,t),s的值变为“qqq”
Equal(s,t)
功能:判断相等运算,若是相等则返回1,反之则返回0.
例如:s=”abb”,t=”cdd”,s.equal(t)值为0
Length(s)
功能:返回s的长度
例如:s=”aaa”,s.Length()值为3
Concat(s,t)
功能:将t链接到s后面
例如:s=”aaa”,t=”bbb”,