循环双链表的基本操作实现

来源:互联网 发布:淘宝客自动采集api 编辑:程序博客网 时间:2024/05/29 02:21
一.实验目的

     巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。


二.实验内容

1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。


三.实验程序实现如下

 1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#include<iostream>
using namespace std;
const int MaxSize=10;
template<class DataType> //定义模板类SeqLIst
class SeqList
{
public:
SeqList(){length=0;} //无参构造函数,建立空顺序表
SeqList(DataType a[],int n); //有参构造函数,建立一个长度为n的顺序表
~SeqList(){} //析构函数为空
int Length(){return length;} //求线性表的长度
DataType Get(int i); //按位查找,在线性表中查找第i个元素
int Locate(DataType x); //按值查找,在线性表中查找值为x的元素序号
void Insert(int i,DataType x); //插入操作,在线性表中第i个位置插入为x的元素
DataType Delete(int i); // 删除操作,删除线性表的第i个元素
void PrintList(); //遍历操作,按序号依次输出各元素
private:
DataType data[MaxSize]; //存放数据元素的数组
int length; //线性表的长度
};
//#include <iostream>
//using namespace std;
//#include"SeqList.h"
//顺序表有参构造函数SeqList SeqList
template<class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
if(n>MaxSize)throw"error";
for(int i=0;i<n;i++)
data[i]=a[i];
length=n;
}

//顺序表按值查找算法Get
template<class DataType>
DataType SeqList<DataType>::Get(int i)
{
if(i<1 && i>length)throw"查找位置非法";
else return data[i-1];
}
//顺序表按位查找算法Locate//记得删除掉这些算法
template<class DataType>
int SeqList<DataType>::Locate(DataType x)
{
for(int i=0;i<length;i++)
if(data[i]==x) return i+1; //下表为1的元素等于i,返回其序号i+1;
return 0; //退出循环,说明查找失败
}
//顺序表插入算法Insert
template<class 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]; //第j个元素存在于数组下标为j-1处
data[i-1]=x;
length++;
}
//顺序表删除算法Delete
template<class DataType>
DataType SeqList<DataType>::Delete(int i)
{
if(length==0)throw"下溢";
if(i<1||i>length)throw"查找位置非法";
DataType x=data[i-1]; //取出位置i的元素
for(int j=i;j<length;j++)
data[j-1]=data[j]; //此处j已经是元素所在的数组下标
length--;
return x;
}
//顺序表遍历算法PrintLIst
template<class DataType>
void SeqList<DataType>::PrintList()
{
for(int i=0;i<length;i++)
cout<<data[i]; //依次输出线性表的元素值
}


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#include<iostream>
using namespace std;

int main()
{
int score[5]={1 ,2 ,3 ,4 ,5};
SeqList<int>ScoreList(score,5);
cout<<"执行插入操作前的数据为:"<<endl;
ScoreList.PrintList();
try
{
ScoreList.Insert(2 ,63);
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<'\n'<<"执行插入操作后的数据为:"<<endl;
ScoreList.PrintList();
cout<<'\n'<<"值为3 的元素位置为:"<<endl;
cout<<'\n'<<ScoreList.Locate(63)<<endl;
cout<<'\n'<<"执行删除第1个元素操作,删除前数据为:"<<endl;
ScoreList.PrintList();
try
{
ScoreList.Delete(1);
}
catch(char *s)
{
cout<<'\n'<<s<<endl;
}
cout<<'\n'<<"删除后的数据为:"<<endl;
ScoreList.PrintList();
}

四.实验结果的截图



五.实验心得与不足

(1)双链表的求长度和遍历操作的临界条件稍有变化,查找操作等也是具体问题具体分析,需要细心耐心地对待。

(2)循环双链表检索和遍历数据操作更加灵活,又因其对称结构,使之插入和删除操作都变得更容易,大大减小了时间复杂度。

(3)这次实验我了解到算法操作的一些“临界”条件的重要性,这也是我现在努力克服的一个难关,希望以后自己能多多增强逻辑思维能力。



原创粉丝点击