目的:通过实际操作间接寻址储存的单链表,掌握间接寻址储存单链表的储存结构以及验证其操作的实现并进一步理解算法与程序的关系。
内容:创建间接寻址储存的单链表并对已创建的单链表实现插入、删除、查找等基本操作。
间接寻址j简介:将数组和指针结合起来的一种方法,它将数组中储存数据元素的的单元改为储存指向改元素的指针。
间接寻址储存单链表类的定义
#include<iostream>
#include<iomanip> //使用了setw()
using namespace std;
const int MaxSize=100;
struct Node
{
int data; //存放的数据
};
class LinkList
{
public:
LinkList() /*无参构造函数*/
{
length=0;
}
LinkList(int a[],int n); /*建立有n个元素的链表*/
~LinkList(){}
void Insert(int i,int x); /*在第i个位置中插入元素值为X的结点*/
int Length() /*求链表的长度*/
{
return length;
}
int Get(int i); /*按位查找,在链表中查找第i个结点的元素值*/
int Locate(int x); /*按值查找*/
int Delete(int i); /*删除链表中第i个结点*/
void PrintList(); /*按序号依次输出各元素*/
private:
Node *ads[MaxSize];
int length;
};
成员函数的定义
//带参构造函数
LinkList::LinkList(int a[],int n)
{
for(int i=0;i<n;i++)
{
ads[i]=new Node; //数据指向每一个结点
ads[i]->data=a[i]; //将数据填入每个数组指向的结点
}
length=n;
}
//插入算法
void LinkList::Insert(int i,int x)
{
if(i<=length&&i>=0)
{
for(int j=length;j>=i;j--)
{
ads[j]=ads[j-1];
}
ads[i-1]->data=x;
length++;
}
else{
throw "位置非法";
}
}
//遍历链表的数据
void LinkList::PrintList()
{
for(int i=0;i<length;i++)
{
cout<<ads[i]->data<<endl;
}
}
//按位查找数据
int LinkList::Get(int i)
{
if(i<=length&&i>0)
{
i=i-1;
return ads[i]->data;
}
else{
throw "位置非法";
}
}
//按值查找数据
int LinkList::Locate(int x)
{
int count=0;
for(count;count<length;count++)
{
if(ads[count]->data==x)
{
return count+1;
}
}
return 0;
}
//删除链表中第i个结点
int LinkList::Delete(int i)
{
if(i<=length&&i>=0)
{
int x=ads[i-1]->data;
for(int j=i;j<length;j++)
{
ads[j-1]=ads[j];
}
length--;
return x;
}
else{
throw "位置非法";
}
}
主函数代码
int main()
{
int n,i;
int a[100];
cout<<"******************"<<endl;
cout<<"*请输入数组的大小"<<endl;
cout<<"******************"<<endl;
cin>>n;
cout<<'\n'<<endl;
cout<<"******************"<<endl;
cout<<"*请输入数组元素*"<<endl;
cout<<"******************"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
LinkList one(a,n);
cout<<'\n'<<endl;
cout<<"~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"线性表的长"<<one.Length()<<endl;
cout<<'\n'<<"线性表中的内容:"<<endl;
one.PrintList(); //输出线性表的数据
//按位查找
int s;
cout<<"~~~~~~~~~~~~~~~~~~"<<endl;
cout<<'\n'<<endl;
cout<<"**********************"<<endl;
cout<<"*请输入要查找数据的序号:"<<endl;
cout<<"**********************"<<endl;
cin>>s;
cout<<'\n'<<'\n'<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
cout<<'\n'<<"您所查询的数据为";
cout<<one.Get(s)<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
//按值查找
int x;
cout<<'\n'<<"**********************"<<'\n'<<"*请输入要查找的数据:";
cout<<'\n'<<"**********************"<<endl;
cin>>x;
cout<<'\n'<<'\n'<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
cout<<'\n'<<"你所查找的值所在的位置为:"<<one.Locate(x)<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
//按序号删除数据
int k;
cout<<'\n'<<"**************************"<<'\n'<<"*请输入需要删除的数据序号:";
cout<<'\n'<<"**************************"<<endl;
cin>>k;
cout<<'\n'<<'\n'<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
cout<<'\n'<<"删除成功!你所删除的数据为:"<<one.Delete(k)<<endl;
cout<<'\n'<<"线性表的内容为:"<<endl;
one.PrintList(); //输出线性表的数据
cout<<'\n'<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
return 0;
}
数据输入以及查询的结果
删除数据的执行结果
心得:
1.间接寻址将储存数据元素的单元改为储存指向该元素的指针,使得线性表可以实现随机存取。
2.从程序上看,算法更容易理解而且更加优化,提高了插入和删除的时间性能。
3.通过自己定义函数,对间接寻址的优缺点有了更加深入的了解。