Fork me on GitHub

实验三 跳表算法设计与实现

一、实验名称:跳表算法设计与实现

二、实验目的:

  1. 掌握跳表的数据结构。
  2. 掌握跳表插入算法的思想和实现。

三、实验内容

完善下列程序,并回答问题。

 1 #include <iostream.h>
 2 #include<stdlib.h>
 3 
 4 enum ResultCode{Underflow, Overflow, Success, Duplicate, RangeError, NotPresent};
 5 template <class T>
 6 struct SNode
 7 {
 8     SNode(int mSize)
 9     {
10         link=new SNode* [mSize];
11     }
12     ~SNode(){ delete[] link;}
13     T element;
14     SNode<T>**link;
15 };
16 
17 template<class T>
18 class SkipList 
19 {
20 public:
21     SkipList(T large, int mLev); 
22     ~SkipList(){};
23     ResultCode Insert(T x);            //函数定义见3.1.1节
24     void printList(){                    // zengjiabufei
25         SNode<T> *p;
26         for(int le = levels; le>=0;le--){
27             p = head->link[le];
28             cout<<"head->";
29             SNode<T> *q;
30             q = head->link[0];
31             while(p != tail){
32                 while(q->element != p->element){
33                     cout<<"---";
34                     q = q->link[0];
35                 } 
36                 if(p->element<10) cout<<"-";
37                 cout<<p->element;
38                 cout<<"-";
39                 p = p->link[le];
40                 q = q->link[0];
41             }
42             while(q!= tail){cout<<"---";q = q->link[0];}
43             cout<<"tail";
44             cout<<endl;
45         }
46     };
47 private:
48     int Level();
49     SNode<T>* SaveSearch(T x);
50     int maxLevel, levels;
51     SNode<T> *head, *tail, **last;
52 };
53 
54 template <class T>
55 SkipList<T>::SkipList(T large, int mLev)
56 {
57     maxLevel=mLev; levels=0;
58     head=new SNode<T>(maxLevel+1);    //指向包括元素域和maxLevel+1个指针的头结点
59     tail=new SNode<T>(0);            //指向只有元素域,不包含指针域的尾结点
60     last=new SNode<T>*[maxLevel+1];    //maxLevel+1个指针
61     tail->element=large;            //尾结点中保存作为哨兵值的最大值large
62     for (int i=0; i<=maxLevel; i++)
63             head->link[i]=tail;        //头结点的所有指针指向尾结点
64 }
65 
66 template <class T>
67 int SkipList<T>::Level()
68 {
69     学生书写部分
70 }
71 
72 template <class T>
73 SNode<T>* SkipList<T>::SaveSearch(T x)
74 {
75     学生书写部分
76 }
77 template <class T>
78 ResultCode SkipList<T>::Insert(T x)
79 {
80     学生书写部分
81 }
82 
83 void main(){
84     int maxlevel = 5;
85     SkipList<int> slist(10000,maxlevel);
86     int ele[30] = {3,7,19,22,70,28,43,2,6,18,21,69,47,42};
87     int n = 14;
88     cout<<"---跳表---"<<endl<<endl;
89     cout<<"分别插入的数字为:";
90     for(int j = 0; j < n; j++) cout<<ele[j]<<",";
91     cout<<"\n初始状态:\n";
92     slist.printList();
93     for(int i = 0; i < n; i++) {
94         slist.Insert(ele[i]);
95         cout<<"\n插入"<<ele[i]<<""<<endl;
96         slist.printList();
97     }
98 }
View Code

 

完善后的程序:

  1 #include <iostream.h>
  2 #include<stdlib.h>
  3 
  4 enum ResultCode{Underflow, Overflow, Success, Duplicate, RangeError, NotPresent};
  5 template <class T>
  6 struct SNode
  7 {
  8     SNode(int mSize)
  9     {
 10         link=new SNode* [mSize];
 11     }
 12     ~SNode(){ delete[] link;}
 13     T element;
 14     SNode<T>**link;
 15 };
 16 
 17 template<class T>
 18 class SkipList 
 19 {
 20 public:
 21     SkipList(T large, int mLev); 
 22     ~SkipList(){};
 23     ResultCode Insert(T x);            //函数定义见3.1.1节
 24     void printList(){                    // zengjiabufei
 25         SNode<T> *p;
 26         for(int le = levels; le>=0;le--){
 27             p = head->link[le];
 28             cout<<"head->";
 29             SNode<T> *q;
 30             q = head->link[0];
 31             while(p != tail){
 32                 while(q->element != p->element){
 33                     cout<<"---";
 34                     q = q->link[0];
 35                 } 
 36                 if(p->element<10) cout<<"-";
 37                 cout<<p->element;
 38                 cout<<"-";
 39                 p = p->link[le];
 40                 q = q->link[0];
 41             }
 42             while(q!= tail){cout<<"---";q = q->link[0];}
 43             cout<<"tail";
 44             cout<<endl;
 45         }
 46     };
 47 private:
 48     int Level();
 49     SNode<T>* SaveSearch(T x);
 50     int maxLevel, levels;
 51     SNode<T> *head, *tail, **last;
 52 };
 53 
 54 template <class T>
 55 SkipList<T>::SkipList(T large, int mLev)
 56 {
 57     maxLevel=mLev; levels=0;
 58     head=new SNode<T>(maxLevel+1);    //指向包括元素域和maxLevel+1个指针的头结点
 59     tail=new SNode<T>(0);            //指向只有元素域,不包含指针域的尾结点
 60     last=new SNode<T>*[maxLevel+1];    //maxLevel+1个指针
 61     tail->element=large;            //尾结点中保存作为哨兵值的最大值large
 62     for (int i=0; i<=maxLevel; i++)
 63             head->link[i]=tail;        //头结点的所有指针指向尾结点
 64 }
 65 
 66 template <class T>
 67 int SkipList<T>::Level()
 68 {
 69     int lev=0;
 70     while(rand()<=RAND_MAX/2) lev++;
 71     return (lev<=maxLevel)?lev:maxLevel;}
 72 
 73 template <class T>
 74 SNode<T>* SkipList<T>::SaveSearch(T x)
 75 {
 76     SNode<T>*p=head;
 77     for(int i=levels;i>=0;i--){
 78        while(p->link[i]->element<x) p=p->link[i];
 79        last[i]=p;
 80     }
 81     return (p->link[0]);
 82 }
 83 template <class T>
 84 ResultCode SkipList<T>::Insert(T x)
 85 {
 86     if(x>=tail->element) return RangeError;
 87     SNode<T>*p=SaveSearch(x);
 88     if(p->element==x) return Duplicate;
 89     int lev=Level();
 90     if(lev>levels){
 91        lev=++levels;
 92        last[lev]=head;
 93     }
 94         SNode<T>* y = new SNode<T>(lev+1);
 95     y->element=x;
 96     for(int i=0;i<=lev;i++){
 97          y->link[i]=last[i]->link[i];
 98          last[i]->link[i]=y;
 99     }
100    return  Success; 
101 }
102 
103 void main(){
104     int maxlevel = 5;
105     SkipList<int> slist(10000,maxlevel);
106     int ele[30] = {3,7,19,22,70,28,43,2,6,18,21,69,47,42};
107     int n = 14;
108     cout<<"---跳表---"<<endl<<endl;
109     cout<<"分别插入的数字为:";
110     for(int j = 0; j < n; j++) cout<<ele[j]<<",";
111     cout<<"\n初始状态:\n";
112     slist.printList();
113     for(int i = 0; i < n; i++) {
114         slist.Insert(ele[i]);
115         cout<<"\n插入"<<ele[i]<<""<<endl;
116         slist.printList();
117     }
118 }
View Code

 

程序问题

1. SkipList的构造函数中,参数large和mLev分别代表什么语义?程序insert中,if(lev>levels) 语句的作用是什么?

2. 分析跳表插入算法,给出插入算法的流程图,或者描述算法思想。

3. 如果输入3,7,19,22,70,28,43,2,6,18,21,69,47,42,实际运行的跳表的最终结构是:

4. 如果输入1到30,层数为7时,实际运行最终的跳表结构是什么。

5. (选做)新建新的程序文件,在上述程序的基础上,修改插入算法,使之可以允许插入重复元素,并输入3,7,19,22,70,28,43,2,6,18,21,69,47,42,3,7,19,22,70,28,43,2,6,18,21,69,47,42, 观察运行结果。

posted @ 2014-12-09 11:41  刘哥聊技术  阅读(538)  评论(0编辑  收藏  举报