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

本文通过建立包含n个学生成绩的循环双链表,探讨了数据结构中线性表的存储方法,详细实现了链表的插入、删除和查找操作,并讨论了这些操作的临界条件和时间复杂度。实验结果显示,循环双链表在检索、遍历和修改数据方面具有灵活性和效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.实验目的

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


二.实验内容

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值