#include <iostream> using namespace std; template <typename T> struct Node { T data; Node *link; Node():data(T()),link(NULL){} }; template<typename T> struct M_Node { Node<T> *adj;//保存节点指针. T data; //保存当前递减数字个数. }; template<typename T> class HashList { public: HashList(int n) { node = new M_Node<T>[n]; for(int i=0;i<n;i++) { node[i].data = 0;//递减节点个数都初始化为0. } size = n; } void Init(int a[]) { for(int i=0;i<size;i++) { Node<T> *s = new Node<T>(); s->data = a[i]; node[i].adj = s; } }//将数组中的每一个数字都当作一个开始节点。 void Insert(int start,int end,int a[]) { Node<T> *p = node[start].adj; for(int i=start+1;i<size;i++) { Node<T> *q = NULL; while(p!=NULL) { q = p; p = p->link; } if(p==NULL && (q->data > a[i])) { Node<T> *s = new Node<T>(); s->data = a[i]; q->link = s; node[start].data++; } p=q; }//依次比较插入节点. } void Show() { int sum = 0; int j = 0; int i =0; for(;i<size;i++) { if(sum<node[i].data) { sum = node[i].data; j = i; } } //得到递减节点数最多的下标. Node<T> *p = node[j].adj; while(p!=NULL) { cout<<p->data<<" "; p=p->link; } cout<<endl; } private: int size; M_Node<T> *node; }; int main() { int a[]={6,5,4,12,11,10,9,3,2,0,12,3,4,6}; HashList<int> sh(14); sh.Init(a); for(int i=0;i<14;i++) { sh.Insert(i,14,a); } sh.Show();//12 11 10 9 3 2 0为输出结果. return 0; }
时间: 2024-12-14 23:08:44