静态链表的基本操作实现

一、实验目的

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


二、实验内容

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

三 、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

2、相关操作的算法表达;

3、完整程序;

4、总结、运行结果和分析。

5、总体收获和不足,疑问等。


四、实验算法(参考书本第43~45页)

  
  

1、定义
(1)静态链表的存储结构定义
const int MaxSize=100;
struct sNode
{
int data;
int next;
}sList[MaxSize];//存放数据的元组

(2)类sList的定义
class List
{
public:
List();//构造函数,含空静态链表
List(int a[],int n);//构造函数,建立含n个元素的静态链表
~List(){} //析构函数
void PrintList();//遍历操作函数,按序号依次输出各元素
int Delete(int i);//删除操作函数
int Get(int i);//按位查找查找函数
int Locate(int x);//按值查找操作函数
void Insert(int i,int x);//插入操作函数
private:
int avail;//指向空链指针
int first;//指向静态链表头指针
};
2、遍历函数PrintList算法
void List::PrintList()
{
int p;//定义工作指针
p=sList[first].next;
while(p!=-1)
{
cout<<sList[p].data<<" ";
p=sList[p].next;
}
}

3、按位查找函数算法
int List::Get(int i)
{
if(i<=MaxSize && i>0)
{
return sList[i].data;
}
else
{
throw"查找不到数据的位置!";
return 0;
}
}

4、按值查找函数算法
int List::Locate(int x)
{
int count;//定义累加器count
count=sList[first].next;
for(count;count!=-1;count++)
{
if(sList[count].data==x)
return count+1;
}
return 0;
}

5、插入函数算法
void List::Insert(int i,int x)
{
int s;
s=avail;//利用空闲链的第一个结点
avail=sList[avail].next; //空闲链的头指针后移
sList[s].data=x; //将x填入下标为s的结点
int p=0;
for(p;p<MaxSize-1;p++)
{
if(p==i)
{
sList[s].next=sList[p].next;//将下标为s的结点插入到下标为p的结点后面
sList[p].next=s;
}
}
}
6、删除函数算法
int List::Delete(int i)
{
if(i<=MaxSize && i>0)
{
int q;
i=i-1;
q=sList[i].next;//暂存被删结点的下标
sList[i].next=sList[q].next;//摘链
sList[q].next=avail;//将节点q插在空闲连的最前端
avail=q;//将节点q插在空闲连的最前端
return sList[q].data;
}
else
{
throw"删除操作位置出错";
return 0;
}
}

7、构造函数

(1)构造一个空链表
List::List()
{
first=0;//初始化头指针
avail=0;//初始化空闲链指针
sList[0].next=-1;//头结点无后续结点
for(int i=0;i<MaxSize;i++)
sList[i].next=i+1;//初始化空闲链
sList[MaxSize-1].next=-1;//置空闲链结束标志
}

(2)有参构造函数
List::List(int a[],int n)
{
int s;
if(n>MaxSize || n<=0)throw "错误";
first=0;//初始化静态链表的头指针
sList[0].next=avail=1;//初始化空闲链的头指针
for(int i=0;i<MaxSize-1;i++)
sList[i].next=i+1;//将数组置为空链
sList[MaxSize-1].next=-1;//置空闲链结束标志
for(int i=0;i<n;i++)
{
s=avail;
sList[s].data=a[i];
avail=sList[avail].next;
}
sList[s].next=-1;
}

8、主函数
void main()
{
int r[5]={99,88,77,66,55};
List L(r,5);
cout<<"执行插入操作前的数据为:"<<"\n"<<endl;
L.PrintList();
cout<<" ";
try
{
L.Insert(2,44);
}
catch(char * s)
{
cout<<s<<endl;
}
cout<<"\n"<<endl;
cout<<"执行插入操作后的数据为"<<"\n"<<endl;
L.PrintList();
cout<<'\n'<<endl;
cout<<"值为66的元素位置为:";
cout<<L.Locate(66)<<endl;
cout<<"\n";
cout<<"执行删除操作前数据为:"<<"\n"<<endl;
L.PrintList();
try
{
L.Delete(1);
}
catch(char * s)
{
cout<<s<<endl;
}
cout<<'\n'<<endl;
cout<<"执行删除操作后数据为:"<<"\n"<<endl;
L.PrintList();
cout<<"\n"<<endl;
}

五、实验代码

 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
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
       
       
#include<iostream>
using namespace std;

//静态链表的存储结构定义如下
const int MaxSize=100;
struct sNode
{
int data;
int next;
}sList[MaxSize];//存放数据的元组

//类sList的定义
class List
{
public:
List();//构造函数,含空静态链表
List(int a[],int n);//构造函数,建立含n个元素的静态链表
~List(){} //析构函数
void PrintList();//遍历操作函数,按序号依次输出各元素
int Delete(int i);//删除操作函数
int Get(int i);//按位查找查找函数
int Locate(int x);//按值查找操作函数
void Insert(int i,int x);//插入操作函数
private:
int avail;//指向空链指针
int first;//指向静态链表头指针
};
//遍历函数PrintList
void List::PrintList()
{
int p;//定义工作指针
p=sList[first].next;
while(p!=-1)
{
cout<<sList[p].data<<" ";
p=sList[p].next;
}
}

//按位查找函数
int List::Get(int i)
{
if(i<=MaxSize && i>0)
{
return sList[i].data;
}
else
{
throw"查找不到数据的位置!";
return 0;
}
}

//按值查找函数
int List::Locate(int x)
{
int count;//定义累加器count
count=sList[first].next;
for(count;count!=-1;count++)
{
if(sList[count].data==x)
return count+1;
}
return 0;
}

//插入函数
void List::Insert(int i,int x)
{
int s;
s=avail;//利用空闲链的第一个结点
avail=sList[avail].next; //空闲链的头指针后移
sList[s].data=x; //将x填入下标为s的结点
int p=0;
for(p;p<MaxSize-1;p++)
{
if(p==i)
{
sList[s].next=sList[p].next;//将下标为s的结点插入到下标为p的结点后面
sList[p].next=s;
}
}
}
//删除函数
int List::Delete(int i)
{
if(i<=MaxSize && i>0)
{
int q;
i=i-1;
q=sList[i].next;//暂存被删结点的下标
sList[i].next=sList[q].next;//摘链
sList[q].next=avail;//将节点q插在空闲连的最前端
avail=q;//将节点q插在空闲连的最前端
return sList[q].data;
}
else
{
throw"删除操作位置出错";
return 0;
}
}

//构造函数

//(1)构造一个空链表
List::List()
{
first=0;//初始化头指针
avail=0;//初始化空闲链指针
sList[0].next=-1;//头结点无后续结点
for(int i=0;i<MaxSize;i++)
sList[i].next=i+1;//初始化空闲链
sList[MaxSize-1].next=-1;//置空闲链结束标志
}

//(2)有参构造函数
List::List(int a[],int n)
{
int s;
if(n>MaxSize || n<=0)throw "错误";
first=0;//初始化静态链表的头指针
sList[0].next=avail=1;//初始化空闲链的头指针
for(int i=0;i<MaxSize-1;i++)
sList[i].next=i+1;//将数组置为空链
sList[MaxSize-1].next=-1;//置空闲链结束标志
for(int i=0;i<n;i++)
{
s=avail;
sList[s].data=a[i];
avail=sList[avail].next;
}
sList[s].next=-1;
}
//析构函数

//主函数
void main()
{
int r[5]={99,88,77,66,55};
List L(r,5);
cout<<"执行插入操作前的数据为:"<<"\n"<<endl;
L.PrintList();
cout<<" ";
try
{
L.Insert(2,44);
}
catch(char * s)
{
cout<<s<<endl;
}
cout<<"\n"<<endl;
cout<<"执行插入操作后的数据为"<<"\n"<<endl;
L.PrintList();
cout<<'\n'<<endl;
cout<<"值为66的元素位置为:";
cout<<L.Locate(66)<<endl;
cout<<"\n";
cout<<"执行删除操作前数据为:"<<"\n"<<endl;
L.PrintList();
try
{
L.Delete(1);
}
catch(char * s)
{
cout<<s<<endl;
}
cout<<'\n'<<endl;
cout<<"执行删除操作后数据为:"<<"\n"<<endl;
L.PrintList();
cout<<"\n"<<endl;
}

六、实验运行结果



七、实验总结和心得

1、静态链表虽然是用数组来存储线性表的元素,但在插入和删除操作时,只需要修改游标,不需要移动表中的元素,从而改进了在线性表的中插入和删除操作需要移动大量元素的缺点。

2、静态链表进行插入操作时,不用申请新结点,只需要利用空闲链的第一个结点。

3、静态链表中运用了默认的析构函数,减少了操作。

4、对数组和链表之间的关系有了进一步的了解,两者的有机结合可以让算法更加简单,但是静态链表没有解决连续存储分配带来的表长难以确定的问题。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值