- using namespace std;
- template <class student>
- class Node
- {
- public:
- student data;
- Node<student> *prior;
- Node<student> *next;
- };
- template <class student>
- class DLL
- {
- public:
- DLL(); //无参的构造函数
- DLL(student score[], int n); //带参的构造函数
- ~DLL(); //析构函数
- int Length(); //返回单链表长度
- void insert(int i, student x); //插入操作,在位置i插入元素
- student get(int i); //按位查找
- int locate(student x); //按值查找
- student Delete(int i); //删除操作
- void print(); //遍历操作
- private:
- Node<student> *first; //双链表的头指针
- int length; //链的长度计数
- };
- template <class student>
- DLL<student>::DLL(student score[], int n)
- {
- length=0;
- first=new Node<student>;
- first->next=NULL;
- first->prior=NULL;
- for (int i=0;i<n;i++)
- {
- Node<student> *s=new Node<student>;
- s->data=score[i];
- s->next=first->next;
- first->next = s;
- }
- }
- template <class student>
- DLL<student>::~DLL()
- {
- while (first->next!=first->prior)
- {
- //临时指针,存储即将释放的节点的指针
- Node<student> *temp=first;
- //脱链
- first->prior->next=first->next;
- first->next ->prior=first->prior;
- //头指针后移
- first=first->next;
- //释放内存
- delete temp;
- }
- delete first;
- }
- template<class student>
- int DLL<student>::Length()
- {
- Node<student> *p;
- int count;
- p=first->next;
- count=0;
- while(p!=NULL)
- {
- p=p->next;
- count++;
- }
- return length;
- }
- template <class student>
- void DLL<student>::insert(int i,student x)
- {
- Node<student>*p,*s;
- int count;
- p=first;
- count=0;
- while(p!=NULL&&count<i-1)
- {
- p=p->next;
- count++;
- }
- if(p==NULL) throw"位置";
- else
- {
- s=new Node<student>;
- s->data=x;
- s->next=p->next;
- p->next=s;
- }
- }
- template <class student>
- student DLL<student>::get(int i)
- {
- Node<student> *p;int count;
- count=1;
- p=first->next;
- while (p!=NULL&&count<i)
- {
- p = p->next;
- count++;
- }
- if (p == NULL)throw"位置非法";
- else return p->data;
- }
- template <class student>
- int DLL<student>::locate(student x)
- {
- Node<student> *p;
- int count;
- p=first->next;
- count=1;
- while(p!=NULL)
- {
- if(p->data==x) return count;
- p=p->next;
- count++;
- }
- return 0;
- }
- template <class student>
- student DLL<student>::Delete(int i)
- {
- Node<student> *p,*q;
- p=first->next;
- int count, x;
- count=1;
- while (p!=NULL&&count<i-1)
- {
- p=p->next;
- count++;
- }
- if (p==NULL||p->next==NULL) throw"位置非法";
- else
- {
- q=p->next;
- x=q->data;
- if (p->next!=NULL)
- {
- if(q->next!=NULL)
- q->next->prior=p;
- else
- {
- p->next=NULL;
- p->next=q->next;
- delete q;
- q=NULL;
- return x;
- }
- }
- p->next=q->next;
- delete q;
- q=NULL;
- return x;
- }
- }
- template <class student>
- void DLL<student>::print()
- {
- Node<student> *p;
- p=first->next;
- while(p->next!=NULL)
- {
- cout<<p->data<<" ";
- p=p->next;
- }
- cout<<p->data<<endl;
- }
- int main()
- {
- float score[8] = {72,88,57,83.5,32.5,68,96,86.5};
- DLL<float>Student(score, 8);
- cout<<"初始成绩如下:"<<endl;
- Student.print();
- cout<<endl<<"在学生3插入成绩86,插入后结果如下:"<<endl;
- Student.insert(3,86);
- Student.print();
- cout<<endl<<"在学生5删除成绩为:"<<Student.Delete(5)<<" , "<<"删除后结果如下:"<<endl;
- Student.print();
- cout<<endl<<"位置6的成绩为:"<<Student.get(6)<<endl;
- cout<<endl<<"成绩72所在位置为:"<<Student.locate(72)<<endl<<endl;
- cout<<"最终数据如下:"<<endl;
- Student.print();
- cout<<endl;
- return 0;
- }