线性表-约瑟夫问题(数据结构基础 第2周)
2016-06-28 10:38
513 查看
问题描述:
![](http://img.blog.csdn.net/20160628102803680)
分析
个人采用顺序表做的,此处要注意一点:在同一.cpp文件下,如果想要在main()函数后定义类模板而在main()函数内使用类模板,则必须在main()函数前写出类模板的完整声明,因为定义类对象的时候必须知道类的所有成员变量和成员函数。具体见代码。
源码
分析
个人采用顺序表做的,此处要注意一点:在同一.cpp文件下,如果想要在main()函数后定义类模板而在main()函数内使用类模板,则必须在main()函数前写出类模板的完整声明,因为定义类对象的时候必须知道类的所有成员变量和成员函数。具体见代码。
源码
#include <iostream> #include <stdio.h> using namespace std; //此处必须在main()函数前写出类模板的完整声明 template <class T> class seqlist { private: T* aList; //存储顺序表的实例 int maxSize; //顺序表实例的最大长度 int curLen; //顺序表的当前长度 int position;//当前处理位置 public: seqlist(const int size); ~seqlist(); void clear(); //置空线性表 int length(); bool isEmpty(); //线性表为空时,返回true bool append(const T value); //在表尾添加一个元素value,表的长度增1 bool insert(const int p, const T value); //在位置p上插入一个元素value,表的长度增1 bool delet(const int p); //删除位置p上的元素,表的长度减1 bool getPos(int& p, const T value); //查找值为value的元素并返回其位置 bool getValue(const int p, T& value); //把位置p元素值返回到变量value bool setValue(const int p, const T value); //用value修改位置p的元素值 }; int josephus_seq(seqlist<int>& palist, int m) { int del = 1; int w=0; for(int i=palist.length(); i>0; i--) { del=(del+m-1)%i; //要删除的元素的索引 if (del==0) del = i; palist.getValue(del-1, w); //求出第del个元素的值 // printf("Out element %d \n", w); //元素出列 palist.delet(del-1); //删除出列的元素 } return w; } int main() { int n, m; cin >> n >> m; seqlist<int> jos_alist(n); for (int i=0; i<n; i++) { jos_alist.append(i+1); } cout << josephus_seq(jos_alist, m) << endl; return 0; } /************************************类模板的实现**************************************/ template <class T> seqlist<T>::seqlist(const int size) { maxSize=size; aList = new T[maxSize]; curLen=position=0; } template <class T> seqlist<T>::~seqlist() { delete []aList; } template <class T> void seqlist<T>::clear() { delete [] aList; curLen=position=0; aList=new T[maxSize]; } template <class T> int seqlist<T>::length() { return curLen; } template <class T> bool seqlist<T>::isEmpty() { if (curLen==0) { return true; } else { return false; } } template <class T> bool seqlist<T>::append(const T value) { if (curLen>=maxSize) //检查顺序表是否溢出 { cout << "The list is overflow" << endl; return false; } aList[curLen]=value; curLen++; return true; } //设元素类型为T,aList是存储顺序表的数组,maxSize是其最大长度; //p为新元素value的插入位置,插入成功则返回true,否则返回false template <class T> bool seqlist<T>::insert(const int p, const T value) { if (curLen>=maxSize) //检查顺序表是否溢出 { cout << "The list is overflow" << endl; return false; } if (p<0 || p>curLen) //检查插入位置是否合法 { cout << "Insertion point is illegal" << endl; return false; } for(int i=curLen; i>p; i--) aList[i]=aList[i-1]; //从表尾curLen-1起往右移动直到p aList[p]=value; //位置p处插入新元素 curLen++; //表的实际长度增1 return true; } //设元素的类型为T;aList是存储顺序表的数组;p为即将删除元素的位置 //删除成功则返回true, 否则返回false template <class T> bool seqlist<T>::delet(const int p) { if (curLen<=0) //检查顺序表是否为空 { cout << "No element to delete" << endl; return false; } if (p<0 || p>curLen-1) //检查删除位置是否合法 { cout << "deletion is illegal" << endl; return false; } for(int i=p; i<curLen; i++) aList[i]=aList[i+1]; curLen--; return true; } template <class T> bool seqlist<T>::getPos(int& p, const T value) { for(int i=0; i<curLen; i++) if (aList[i]==value) { p=i; return true; } cout << "can not find element: " << value << endl; return false; } template <class T> bool seqlist<T>::getValue(const int p, T& value) { if (curLen<=0) //检查顺序表是否为空 { cout << "No element" << endl; return false; } if (p<0 || p>curLen-1) //检查删除位置是否合法 { cout << "getvalue is illegal" << endl; return false; } value = aList[p]; return true; } template <class T> bool seqlist<T>::setValue(const int p, const T value) { if (curLen<=0) //检查顺序表是否为空 { cout << "No element" << endl; return false; } if (p<0 || p>curLen-1) //检查删除位置是否合法 { cout << "setvalue is illegal" << endl; return false; } aList[p] = value; return true; }
相关文章推荐
- java线性表排序示例分享
- php线性表的入栈与出栈实例分析
- C++语言实现线性表之数组实例
- C语言线性表的顺序表示与实现实例详解
- C++语言实现线性表之链表实例
- 简单介绍线性表以及如何实现双链表
- Go语言实现顺序存储的线性表实例
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- 结构之美:定义一个线性表
- 结构之美:线性表的查找、插入与删除操作
- 线性表的概念、结构与基本操作
- 结构之美:线性表的链式存储结构——链表
- 线性表的几个链式储存结构介绍
- 数据结构_线性表
- 深入分析 Linux 内核链表
- 第03话:线性表的顺序存储结构
- 第02话:线性表的抽象数据类型ADT定义
- 第01话:线性表的概念与定义
- 线性表-顺序表-数据结构java版
- 对线性表理解以及C语言实现链表的插入删除等操作。