双链表实现

来源:互联网 发布:伊人独泪谁人知 编辑:程序博客网 时间:2024/06/06 12:22

一、实验目的

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

二、实验内容

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

三、源代码

#include<iostream>const int MaxSize=20;using namespace std;template<typename T>struct Node{T data;Node<T> *prior,*next,*first;};template<typename T>class Linklist{private:Node<T> *prior,*next,*first;int length;public:Linklist();Linklist(T a[],int n);~Linklist();int Length();T Get(int i);//按位查找int Locate(T x);//按值查找void Insert(int i,T x);//插入T Delete(int i);//删除void PrintList();//遍历};template<typename T>Linklist<T>::Linklist(){first=new Node<T>;first->next=NULL;first->prior=NULL:}template<typename T>Linklist<T>::Linklist(T a[],int n){first=new Node<T>;first->next=NULL;for(int i=0;i<n;i++){Node<T> *s;s=new Node<T>;s->data=a[i];s->next=first->next;first->next=s;s->prior=first;}}template<typename T>Linklist<T>::~Linklist(){while(first!=NULL){Node<T> *q;q=first;first=first->next;delete q;}}template<typename T>int Linklist<T>::Length(){Node<T> *p;p=first->next;int count=0;while(p!=NULL){p=p->next;count++;}return count;}template<typename T>T Linklist<T>::Get(int i){   Node<T> *p;p=first->next;int count=1;while(p!=NULL&&count<i) {p=p->next;count++;}if(p==NULL) throw"位置";else return p->data;}template<typename T>int Linklist<T>::Locate(T x){Node<T> *p;p=first->next;int count=1;while(p!=NULL){if(p->data==x)return count;p=p->next;count++;}return 0;}template<typename T>void Linklist<T>::Insert(int i,T x){Node<T> *p;p=first;int count=0;while(p!=NULL&&count<i-1){p=p->next;count++;}if(p==NULL) throw"位置非法";else{Node<T> *s;s=new Node<T>;s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;s->data=x;}}template<typename T>T Linklist<T>::Delete(int i){Node<T> *p;p=first;int count=0;while(p!=NULL&&count<i-1){p=p->next;count++;}if(p==NULL||p->next==NULL)throw"位置非法";else{T x;x=p->data;Node<T> *q;q=p->next;(q->prior)->next=q->next;(q->next)->prior=q->prior;delete q;return x;}}template<typename T>void Linklist<T>::PrintList(){Node<T> *p;p=first->next;while(p!=NULL){cout<<p->data;cout<<" ";p=p->next;}}void main(){int b[10]={90,98,99,94,89,87,86,80,84,82};Linklist<int>c(b,10);cout<<"显示所有学生的成绩"<<endl;c.PrintList();cout<<endl;cout<<"学生总数为:"<<c.Length()<<endl;cout<<"查找的第三位学生的成绩为:"<<endl;cout<<c.Get(3)<<endl;cout<<"查找成绩为99的学生:"<<endl;cout<<c.Locate(99)<<endl;cout<<"在第二个学生前插入成绩为78的学生"<<endl;try{c.Insert(2,78);}catch(char *s){cout<<s<<endl;}cout<<"插入后显示所有学生成绩"<<endl;c.PrintList();cout<<endl;cout<<"删除第一个学生成绩后剩下学生的成绩为:"<<endl;try{c.Delete(1);}catch(char *s){cout<<s<<endl;}c.PrintList();}
四、运行结果


五、实验心得

因为双链表的求表长、按位查找等操作的实现与单链表的差不多,所以搞懂单链表后再去做双链表,会比较容易一点,花费的时间相对会短一点。但最后运行的时候,在插入成绩那里卡到了,后面删除的操作都运行不出来。检查了几遍插入Insert外函数的语句,都没有找到错误。最后放弃(烦到了),第二天早上才继续看双链表,想到可能是构造函数那里出错,最后加上s->prior=first,运行成功。还是要多加练习,多理解,才能减少错误。多练习。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 洗衣液没稀释把衣服染褪色了怎么办 衣服被洗衣液洗褪色了怎么办 b站不小心点了差评怎么办 c盘文件目录损坏且无法读取怎么办 打印发票时发票上的字体变大怎么办 淘宝店铺食品违法遇到打假人怎么办 搜狗输入法说我没有权限安装怎么办 申请移民美国期间护照到期了怎么办 自己申请的qq号账号忘了怎么办 苹果手机下完游戏找不到在哪怎么办 苹果四下游戏的密码忘了怎么办 qq斗地主老自动发消息怎么办 微信小程序斗地主被限制了怎么办 台式电脑玩斗地主总黑屏怎么办 玩斗地主屏幕出现一半玩不了怎么办 电脑qq文件破损或部分丢失怎么办 华为平板电脑开机密码忘记了怎么办 微信被太多人投诉被限制登录怎么办 微信账号被永久封号里面的钱怎么办 乱世王者领礼包时账号异常怎么办 qq填写资料见证号格式错误怎么办 如果把微信注销 王者的号怎么办 93元的吃鸡号忘了激活吗怎么办 王者荣耀实名注册不是自己的怎么办 苹果手机打开qq太慢了怎么办 剪辑视频打开了软件关闭不了怎么办 玩永恒纪元手游网络老掉线怎么办 绝地求生买的钥匙激活码忘了怎么办 魅族手机移动网络打不开网页怎么办 小米5s升级后下载不了软件怎么办 电脑可以登qq却开不了网页怎么办 手机微信图片没下载原图怎么办 qq号密码忘了密保忘了怎么办 扣扣更改密保手机失败怎么办 至尊宝安全模式密保手机更换怎么办 微信号手机号换了密码忘记了怎么办 被加盟网店托管骗了怎么办 善林金融倒闭投资者的钱怎么办? 微信支付密码忘了怎么办没绑卡 美团外卖没有骑手接单怎么办 发微信的"发送"没有了怎么办