线性表学习笔记

Posted 未定_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表学习笔记相关的知识,希望对你有一定的参考价值。

一、顺序表
线性表的顺序存储结构,以下通过数组实现。
常用操作:
•构建、析构、求长度、判空、遍历
•按位查找:判断查找位置,返回
•按值查找:判断是否能找到,返回
•插入:在表的第i(1<=i<=n+1)个位置插入新元素。判断数组长度与空间长度,判断插入位置,右移,插入,长度加1。
•删除:将表的第(1<=i<=n)个元素删去。判断是否为空,判断删除位置,取被删元素,左移,长度减1,返回被删元素。

#include<iostream>
using namespace std;
const int MaxSize=100;
class SeqList
{
public:
    SeqList();//建立空的顺序表
    SeqList(int a[],int n);//建立长度为n的顺序表
    ~SeqList();
    int Length();//求线性表的长度
    int Get(int i);//按位查找
    int Locate(int x);//按值查找
    void Insert(int i,int x);//插入
    int Delete(int i);//删除
    int Empty();//判断是否为空
    void PrintList();//遍历
private:
    int data[MaxSize];
    int length;
};
SeqList::SeqList()
{
    length=0;
}
SeqList::SeqList(int a[],int n)
{
    if(n>MaxSize)
        throw"参数非法";
    for(int i=0; i<n; i++)
        data[i]=a[i];
    length=n;
}
SeqList::~SeqList()
{
    length=0;

}
int SeqList::Length()
{
    return length;
}
int SeqList::Get(int i)
{
    if(i<1||i>length)
        throw"查找位置非法";
    else return data[i-1];
}
int SeqList::Locate(int x)
{
    for(int i=0; i<length; i++)
    {
        if(data[i]==x)
            return i+1;
    }
    return 0;//用于判断是否找到
}
//插入:在表的第i(1<=i<=n+1)个位置插入新元素
void SeqList::Insert(int i,int x)
{
    if(length>=MaxSize)
        throw"上溢";
    if(i<1||i>length+1)
        throw"插入位置错误";
    for(int j=length; j>=i; j--)
        data[j]=data[j-1];
    data[i-1]=x;
    length++;
}
//删除:将表的第(1<=i<=n)个元素删去
int SeqList::Delete(int i)
{
    int x;
    if(length==0)
        throw"下溢";
    if(i<1||i>length)
        throw"删除位置错误";
    x=data[i-1];//取出被删元素
    for(int j=i; j<length; j++)
        data[j-1]=data[j];
    length--;
    return x;
}
int SeqList::Empty()
{
    if(length==0)
        return 1;
    else return 0;
}
void SeqList::PrintList()
{
    for(int i=0;i<length;i++)
        cout<<data[i]<<" ";
    cout<<endl;
}
int main( )
{
    int r[5]={1,2,3,4,5},i,x;
    SeqList L(r,5); //建立具有5个元素的顺序表
    cout<<"当前线性表的数据为:";
    L.PrintList(); //输出当前线性表1 2 3 4 5
    try
    {
        L.Insert(2,8); //在第2个位置插入值为8的元素
        cout<<endl<<"执行插入操作后数据为:";
        L.PrintList( ); //输出插入后的线性表1 8 2 3 4 5
        cout<<endl;
    }
    catch(char* str)//捕捉异常,如:上溢
    {
        cout<<str<<"插入操作错误!"<<endl;
    }
    cout<<"当前线性表的长度为:"<<L.Length();//输出线性表的长度6
    cout<<endl;
    cout<<"请输入查找的元素值:";
    cin>>x;
    i=L.Locate(x);
    if(i==0)
        cout<<"查找失败"<<endl;
    else cout<<"元素"<<x<<"的位置为:"<<i<<endl;
    try
    {
        cout<<"请输入查找第几个元素值:";
        cin>>i;
        cout<<"第"<<i<<"个元素值是"<<L.Get(i)<<endl;
    }
    catch(char* str)
    {
        cout<<"线性表中没有该元素"<<endl;
    }
    try
    {
        cout<<"请输入要删除第几个元素:";
        cin>>i;
        x=L.Delete(i); //删除第i个元素
        cout<<"删除的元素是"<<x<<",删除后数据为:";
        L.PrintList(); //输出删除后的线性表
    }
    catch(char* str)
    {
        cout<<str<<endl;
    }
    return 0;
}

#include<iostream>
using namespace std;
const int MaxSize=100;
template<typename DataType>
class SeqList
{
public:
    SeqList();//建立空的顺序表
    SeqList(DataType a[],int n);//建立长度为n的顺序表
    ~SeqList();
    int Length();//求线性表的长度
    DataType Get(int i);//按位查找
    int Locate(DataType x);//按值查找
    void Insert(int i,DataType x);//插入
    DataType Delete(int i);//删除
    int Empty();//判断是否为空
    void PrintList();//遍历
private:
    DataType data[MaxSize];
    int length;
};
template<typename DataType>
SeqList<DataType>::SeqList()
{
    length=0;
}
template<typename DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
    if(n>MaxSize)
        throw"参数非法";
    for(int i=0; i<n; i++)
        data[i]=a[i];
    length=n;
}
template<typename DataType>
SeqList<DataType>::~SeqList()
{
    length=0;

}
template<typename DataType>
int SeqList<DataType>::Length()
{
    return length;
}
template<typename DataType>
DataType SeqList<DataType>::Get(int i)
{
    if(i<1||i>length)
        throw"查找位置非法";
    else return data[i-1];
}
template<typename DataType>
int SeqList<DataType>::Locate(DataType x)
{
    for(int i=0; i<length; i++)
    {
        if(data[i]==x)
            return i+1;
    }
    return 0;//用于判断是否找到
}
//插入:在表的第i(1<=i<=n+1)个位置插入新元素
template<typename DataType>
void SeqList<DataType>::Insert(int i,DataType x)
{
    if(length>=MaxSize)
        throw"上溢";
    if(i<1||i>length+1)
        throw"插入位置错误";
    for(int j=length; j>=i; j--)
        data[j]=data[j-1];
    data[i-1]=x;
    length++;
}
//删除:将表的第(1<=i<=n)个元素删去
template<typename DataType>
DataType SeqList<DataType>::Delete(int i)
{
    DataType x;
    if(length==0)
        throw"下溢";
    if(i<1||i>length)
        throw"删除位置错误";
    x=data[i-1];//取出被删元素
    for(int j=i; j<length; j++)
        data[j-1]=data[j];
    length--;
    return x;
}
template<typename DataType>
int SeqList<DataType>::Empty()
{
    if(length==0)
        return 1;
    else return 0;
}
template<typename DataType>
void SeqList<DataType>::PrintList()
{
    for(int i=0;i<length;i++)
        cout<<data[i]<<" ";
    cout<<endl;
}
int main( )
{
    int r[5]= {1,2,3,4,5},i,x;
    SeqList<int>L(r,5); //建立具有5个元素的顺序表
    cout<<"当前线性表的数据为:";
    L.PrintList( ); //输出当前线性表1 2 3 4 5
    try
    {
        L.Insert(2,8); //在第2个位置插入值为8的元素
        cout<<endl<<"执行插入操作后数据为:";
        L.PrintList( ); //输出插入后的线性表1 8 2 3 4 5
        cout<<endl;
    }
    catch(char* str)//捕捉异常,如:上溢
    {
        cout<<str<<"插入操作错误!"<<endl;
    }
    cout<<"当前线性表的长度为:"<<L.Length();//输出线性表的长度6
    cout<<endl;
    cout<<"请输入查找的元素值:";
    cin>>x;
    i=L.Locate(x);
    if(i==0)
        cout<<"查找失败"<<endl;
    else cout<<"元素"<<x<<"的位置为:"<<i<<endl;
    try
    {
        cout<<"请输入查找第几个元素值:";
        cin>>i;
        cout<<"第"<<i<<"个元素值是"<<L.Get(i)<<endl;
    }
    catch(char* str)
    {
        cout<<"线性表中没有该元素"<<endl;
    }
    try
    {
        cout<<"请输入要删除第几个元素:";
        cin>>i;
        x=L.Delete(i); //删除第i个元素
        cout<<"删除的元素是"<<x<<",删除后数据为:";
        L.PrintList(); //输出删除后的线性表
    }
    catch(char* str)
    {
        cout<<"删除失败"<<endl;
    }
    return 0;
}

二、单链表
1.null与nullptr的区分:
•NULL是宏:

#define NULL 0
#define NULL ((void *)0)    //c语言中支持隐式数据类型转换,可以把void* 变成其它类型的指针

•nullptr 是关键字,表示空指针,可以转化为任何的指针类型。
(注:C语言支持void隐式的数据类型转换,将void 转换成需要的类型,但C++语言,不能隐式的将void* 转换成其它的指针类型,因此在C++中只能将NULL 定义为0。C++ 程序中使用NULL也可能造成二义性。)
2.单链表
3.常用操作:
(1)构造单链表:
•头插法
插入的时候先连s的后面再连前面

LinkList::LinkList(int a[],int n)
{
    first=new Node;
    first->next= nullptr;//建空表
    Node *s;
    for(int i=0; i<n; i++)
    {
        s=new Node;
        s->data=a[i]; //为每个数组元素建立一个结点
        s->next=first->next;
        first->next=s;
    }
}

•尾插法

LinkList::LinkList(int a[],int n)
{
    first=new Node;
    Node *r=first,*s=nullptr;
    for(int i=0; i<n; i++)
    {
        s=new Node;
        s->data=a[i]; //为每个数组元素建立一个结点
        r->next=s;
        r=s;
    }
    r->next=nullptr;
}

(2)求长度、遍历
建指针,循环移动指针,求长或遍历。
(3)按位查找
建指针p,指针移动到i处,判断该位置是否为空,输出
(4)按值查找
建指针p,指针移动寻找x
(5)插入
建指针p,指针移动到i-1处,判断插入位置,建新节点s存数据,新结点先连后再连前
(6)删除
建指针p,指针移动到i-1处,判断删除位置,建新结点存删除数据,摘链,删除
(7)判空
first->next为空就是空的

#include<iostream>
using namespace std;
struct Node
{
    int data;
    Node *next;
};
class LinkList
{
public:
    LinkList();//建立只有头结点的单链表
    LinkList(int a[],int n);//建立n个元素的单链表
    ~LinkList();
    int Length();//求单链表的长度
    int Get(int i);//按位查找
    int Locate(int x);//按值查找
    void Insert(int i,int x);//插入
    int Delete(int i);//删除
    Java数据结构学习笔记之一线性表的存储结构及其代码实现

数据结构与算法学习笔记:线性表Ⅰ

数据结构与算法学习笔记 线性表Ⅱ

数据结构(C++)学习笔记——线性表

数据结构学习笔记 线性表的顺序存储和链式存储

数据结构与算法学习笔记