您的位置:首页 > 其它

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

2017-10-10 23:57 274 查看
一.实验目的

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

二.实验内容

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> //定义模板类SeqLIstclass 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                                                                                                                                                                                                                                                                                 SeqListtemplate<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; //退出循环,说明查找失败 } //顺序表插入算法Inserttemplate<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++; }//顺序表删除算法Deletetemplate<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; } //顺序表遍历算法PrintLIsttemplate<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)这次实验我了解到算法操作的一些“临界”条件的重要性,这也是我现在努力克服的一个难关,希望以后自己能多多增强逻辑思维能力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: