#include <iostream> using namespace std; const int INFMIN = -999999; class Node { friend class IdxTab; public: Node() :next(nullptr) {}; private: int w; Node *next; }; class IdxNode { friend class IdxTab; private: int maxk; Node *fidx; }; class IdxTab { public: void CreateList(); void Prient_Elem_maxk();//输出查找表的元素 void Print_Elem_w();//输出元素 bool Find_Elem(int k);//查找值为k的元素 bool Insert(int k);//插入元素k bool Delete(int k);//删除元素k ~IdxTab(); private: IdxNode *elem; int len; }; IdxTab::~IdxTab() { Node *p,*q; for (int i = 0; i <= len; i++) { p = elem[i].fidx; if (p == nullptr) continue; q = p->next; delete p; if (q == nullptr) continue; else p = q; } for (int i = 0; i <= len; i++) elem[i].fidx = nullptr; } void IdxTab::CreateList() { Node *p; int n; int N; cout << "请输入要存储的数的个数" << endl; cin >> n; cout << "请输入每大块中每小块的数目是多少" << endl; cin >> N; int m = (n / N) + 1; len = m; elem = new IdxNode[m + 1]; for (int i = 0; i < m + 1; i++) elem[i].fidx = nullptr; int cnt = 0;//计数器 cout << "请依次输入要存储的数" << endl; for (int i = 1; i <= len; i++) { elem[i].maxk = INFMIN; for (int j = 1; j <= N && cnt < n; j++)//因为可能输入的n不够整除,查找表最后一个节点可能连的节点比较少,用 //cnt<n,来处理这种情况 { cnt++; p = new Node; int tmp; cin >>tmp; p->w = tmp; p->next = elem[i].fidx; elem[i].fidx = p; if (tmp > elem[i].maxk) elem[i].maxk = tmp;//更新maxk } } for (int i = 1; i <= len-1; i++)//选择排序给查找表排序 { int minv = i; for (int j = i + 1; j <= len; j++) if (elem[minv].maxk > elem[j].maxk) minv = j; if (i != minv) { int tmp = elem[i].maxk; elem[i].maxk = elem[minv].maxk; elem[minv].maxk = tmp; Node *s; s = elem[i].fidx; elem[i].fidx = elem[minv].fidx; elem[minv].fidx = s; } } } bool IdxTab::Find_Elem(int k) { if (k > elem[len].maxk) return false;//如果输入的k直接大于最大的元素,直接return false; int j = 1; while (elem[j].maxk < k) j++; Node *p; for (p = elem[j].fidx;p;p = p->next) { if ((p->w) == k) return true; } return false; } bool IdxTab::Insert(int k) { Node *s; int j = 1; if (k > elem[len].maxk)//如果k大于最大元素,直接处理查找表最后一个节点 { s = new Node; s->w = k; s->next = elem[len].fidx; elem[len].fidx = s; elem[len].maxk = k; return true; } else while (elem[j].maxk < k) j++; s = new Node; s->w = k; s->next = elem[j].fidx; elem[j].fidx = s; return true; } bool IdxTab::Delete(int k) { if (k > elem[len].maxk) return false; int j = 1; while (elem[j].maxk < k) j++; Node *p, *q; p = elem[j].fidx; bool flag = false;//用flag表示有没有值为k这个元素 if ((p->w) == k)//因为没有空白头节点,所以要特别判断一下要删除的是fidx { flag = true; elem[j].fidx = p->next; delete p; } else for (q = elem[j].fidx; q->next; q = q->next) { if ((q->next->w) == k) { flag = true; p = q->next; q->next = p->next; delete p; break; } } if (k == elem[j].maxk)//判断删除的是不是更好是值为最大关键字 { elem[j].maxk = INFMIN; for (p = elem[j].fidx; p; p = p->next) { if ((p->w) > elem[j].maxk) elem[j].maxk = p->w; } if (j == len) return true; for (int i = 1; i <= len - 1; i++)//选择排序给查找表排序 { int minv = i; for (int j = i + 1; j <= len; j++) if (elem[minv].maxk > elem[j].maxk) minv = j; if (i != minv) { int tmp = elem[i].maxk; elem[i].maxk = elem[minv].maxk; elem[minv].maxk = tmp; Node *s; s = elem[i].fidx; elem[i].fidx = elem[minv].fidx; elem[minv].fidx = s; } } if (flag) return true; return false; } } void IdxTab::Print_Elem_w() { Node *p; for (int i = 1; i <= len; i++) { for (p = elem[i].fidx; p; p = p->next) cout << p->w << " "; } cout << endl; } void IdxTab::Prient_Elem_maxk() { for (int i = 1; i <= len; i++) cout << elem[i].maxk << " "; cout << endl; } int main() { IdxTab l; l.CreateList(); l.Prient_Elem_maxk(); l.Print_Elem_w(); int k; cin >> k; l.Insert(k); l.Prient_Elem_maxk(); l.Print_Elem_w(); cin >> k; l.Insert(k); l.Prient_Elem_maxk(); l.Print_Elem_w(); cin >> k; l.Delete(k); l.Prient_Elem_maxk(); l.Print_Elem_w(); cin >> k; l.Delete(k); l.Prient_Elem_maxk(); l.Print_Elem_w(); return 0; }
测试结果: