静态链表
来源:互联网 发布:双色球杀号软件 编辑:程序博客网 时间:2024/05/20 02:27
静态链表
一、实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二、实验内容
建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
三、详细设计(C++)
1.算法设计
定义顺序表的数据类型——静态链表类,包括插入、删除、查找、遍历等基本操作。
静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。静态链表的每个数组元素由两个域构成:data域存放数据元素,next域存放该元素的后继元素所在的数组下标。Avail是空闲链(所有空闲数组单元组成的单链表)头指针,first是静态链表头指针。
插入操作:首先从空闲链的最前端摘下一个结点,将该结点插入静态链表中。
1. 数组元素下标p初始化;
2. 查找第i-1个结点并使数组元素下标p指向该结点;
3. 若查找不成功,说明插入位置不合理,抛出参数非法;
否则,
3.1不用申请新结点,利用空闲链的第一个结点
3.2空闲链的头指针后移
3.3将x填入下标为s的结点
3.4将下标为s的结点插入到下标为p的结点后面
删除操作:
1 数组元素下标p初始化,累加器count初始化;
2 查找第i个结点并使用数组元素下标p指向该结点;
3 若p=-1,则抛出参数非法;
否则,数组元素下标p指向待删除结点
3.1 暂存被删结点的下标
3.2 摘链
3.3 将结点q插在空闲链avail的最前端
3.4 空闲链头指针avail指向结点q
2.源程序代码
#include<iostream>using namespace std;const int MaxSize=100;struct SNode{int data;int next;}SList[MaxSize];class StaticList{public:StaticList();StaticList(int a[],int n);~StaticList();int Length();int Get(int i);int Locate(int x);void Insert(int i,int x);int Delete(int i);void PrintList();private:int first,avail;};StaticList::StaticList(){for(int i=0;i<MaxSize-1;++i){SList[i].next=i+1;}SList[MaxSize-1].next=0;}StaticList::StaticList(int a[],int n){if(n<0||n>MaxSize)throw"参数非法";for(int i=0;i<MaxSize;i++){SList[i].next=i+1;}SList[MaxSize-1].next=-1;first=0;avail=1;SList[first].next=-1;for(int j=0;j<n;j++){int s=avail;avail=SList[avail].next;SList[s].data=a[j];SList[s].next=SList[first].next;SList[first].next=s;}}StaticList::~StaticList(){}int StaticList::Length(){if(0==SList[1].next)return 0;int i=1;int count=-1;do{++count;i=SList[i].next;}while(0!=i);return count;}int StaticList::Get(int n){int i=1;while(0!=i&&SList[SList[i].next].data!=n)i=SList[i].next;if(0==i){cout<<"位置异常"<<endl;return -1;}return i;}int StaticList::Locate(int x){if(SList[first].next==-1)throw"无成绩";int p=first,count=0;while(SList[p].next!=-1){if(SList[p].data==x)return count;p=SList[p].next;count++;}return 0;}void StaticList::Insert(int i,int x){if(i<0||i>MaxSize)throw"参数非法";int s=avail;int p=first;if(p==-1)throw"参数非法";for(int count=0;count<i-1;count++){p=SList[p].next;}avail=SList[avail].next;SList[s].data=x;SList[s].next=SList[p].next;SList[p].next=s;}int StaticList::Delete(int i){if(i<0||i>MaxSize)throw"参数非法";int p=first;if(p==-1)throw"参数非法";for(int count=0;count<i-1;count++){p=SList[p].next;}int q=SList[p].next;SList[p].next=SList[q].next;SList[q].next=avail;avail=q;return 0;}void StaticList::PrintList(){int p=SList[first].next;while(p!=-1){cout<<SList[p].data<<" ";p=SList[p].next;}cout<<endl;}int main(){int score[10]={95,64,78,59,46,39,66,89,91,10};StaticList List(score,10);cout<<"查询分数前的数据为:"<<endl;List.PrintList();cout<<"值为66的元素位置为:";cout<<List.Locate(66)<<endl;cout<<"插入前的数据为:"<<endl;List.PrintList();try{List.Insert(2,77);}catch(char *s){cout<<s<<endl;}cout<<"插入后的数据为:"<<endl;List.PrintList();cout<<"删除前的数据为a:"<<endl;List.PrintList();try{List.Delete(10);}catch(char *s){cout<<s<<endl;}cout<<"删除第十个元素后的数据为:"<<endl; List.PrintList();system("pause");}
四、运行与测试结果
- 静态链表
- VB静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表实例
- 静态链表
- 静态链表。实现。
- 静态链表
- 静态链表
- 静态链表例子
- 静态链表模版
- 静态链表
- 【数据结构】静态链表
- 静态链表
- 静态链表
- 一个假程序员的一些感想
- hdu-2013-蟠桃记
- 一篇写Spring事务管理的很好的文章和摘要
- 人民币转化汉字的java写法
- 分布式与集群的区别,一致性hash,hadoop与HBASE,消息,关于分布式系统的数据一致性问题(来自公众号:360doc个人图书馆)
- 静态链表
- 毕业快4个月了,来个小总结!
- gbk编码
- 谈谈数据库连接池的原理
- cronlog 拆分catalina.out日志
- 得到Android团队无埋点方案
- 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布(3元获取腾讯云服务器带小程序支持系统)
- 内存相关
- python 的日志logging模块学习