多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 線性表-順序表、鏈表類模板的實現(數據結構基礎 第2周)

線性表-順序表、鏈表類模板的實現(數據結構基礎 第2周)

來源:程序員人生   發布時間:2016-08-03 09:05:39 閱讀次數:2517次

學習完課程后,自己用C++實現了簡單的順序表和鏈表,并用約瑟夫問題做了測試,不保證完全正確。
其中有1點需要注意1下:C++中類模板聲明頭文件和實現頭文件不可以分離到.h和.cpp中,否則沒法正常編譯,詳見:https://www.zhihu.com/question/20630104

源碼
1.順序表
//seqlist.h

#pragma once #include <iostream> using namespace std; 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); //在表尾添加1個元素value,表的長度增1 bool insert(const int p, const T value); //在位置p上插入1個元素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的元素值 }; 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⑴起往右移動直到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; }

//source.cpp

#include <iostream> #include "seqlist.h" #include <stdio.h> using namespace std; void josephus_seq(seqlist<int>& palist, int s, int m) { int del = s; 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); //刪除出列的元素 } } int main() { seqlist<int> jos_alist(100); int n, s, m; printf("\n please input the values(<100) of n = "); //參與游戲的人數 scanf("%d", &n); printf("please input the values of s = "); //開始的人 scanf("%d", &s); printf("please input the values of m = "); ///單詞計數 scanf("%d", &m); for (int i=0; i<n; i++) { jos_alist.append(i+1); } josephus_seq(jos_alist, s, m); return 0; }

2.鏈表
//lnklist.h

#pragma once template <class T> class Link { public: T data; //用于保存結點元素的內容 Link<T> *next; //指向后繼結點的指針 Link(const T info, Link<T>* nextValue=NULL) { data=info; next= nextValue; } Link():next(NULL) {} }; template <class T> class lnkList:public Link<T> { private: Link<T> *head, *tail; //單鏈表的頭尾指針 Link<T>* setPos(const int i); //返回第i個元素的指針值 public: lnkList(); //構造函數 ~lnkList(); //析構函數 bool isEmpty(); //判斷鏈表是不是為空 void clear(); //置空線性表 int length(); //返回此鏈表當前實際長度 bool append(const T value); //在表尾添加1個元素value,表的長度增1 bool insert(const int i, const T value); //在位置i上插入1個元素value,表的長度增1 bool delet(const int i); //刪除位置i上的元素,表的長度減1 bool getValue(const int i, T& value); //把位置i元素值返回到變量value bool getPos(int& i, const T value); //查找值為value的元素并返回其位置 }; template <class T> lnkList<T>::lnkList() { head=NULL; tail=NULL; } template <class T> lnkList<T>::~lnkList() { if (head==NULL) { return; } Link<T>* cur=head; while(cur != NULL) { Link<T>* del=cur; cur = cur->next; delete del; } delete cur; head=NULL; tail=NULL; } template <class T> Link<T>* lnkList<T>::setPos(const int i) { int count=0; Link<T>* p=head; //循鏈定位,若i為0則定位到第1個結點 while(p != NULL && count<i) { p=p->next; count++; } return p; //指向結點i } template <class T> bool lnkList<T>::insert(const int i, const T value) { Link<T> *p, *q; if ((p=setPos(i-1))==NULL) //p是位置i結點的先驅 { cout << "Insertion point is illegal" << endl; return false; } q = new Link<T>(value, p->next); p->next = q; if (p==tail) //插入點在鏈尾,插入結點成為新的鏈尾 { tail = q; } return true; } template <class T> bool lnkList<T>::delet(const int i) { Link<T> *p, *q; if (i==0){ //刪除頭結點 q=head; head=head->next; delete q; return true; } p=setPos(i-1); if (p==NULL || p==tail) { //刪除的結點不存在 cout << "deletion is illegal" << endl; return false; } q=p->next; //q是真正待刪除結點 if (q==tail) //待刪結點為尾結點,則修改尾指針 { tail = p; p->next=NULL; } else p->next=q->next; //刪除結點q并修改鏈指針 delete q; return true; } template <class T> bool lnkList<T>::isEmpty() { if (head==NULL) { return true; } else { return false; } } template <class T> void lnkList<T>::clear() { if (head==NULL) { return; } Link<T>* cur=head; while(cur != NULL) { Link<T>* del=cur; cur = cur->next; delete del; } delete cur; head=NULL; tail=NULL; } template <class T> int lnkList<T>::length() { int count=0; Link<T>* cur=head; while(cur) { count++; cur = cur->next; } return count; } template <class T> bool lnkList<T>::append(const T value) { Link<T>* newLink = new Link<T>(value); if (head==NULL) { head=newLink; tail=head; } else { tail->next = newLink; tail=newLink; } return true; } template <class T> bool lnkList<T>::getPos(int& i, const T value) { Link<T>* cur=head; int count=0; while(cur) { if (cur->data==value) { i=count; return true; } cur = cur->next; count++; } cout << "can not find element: " << value << endl; return false; } template <class T> bool lnkList<T>::getValue(const int i, T& value) { int count=0; Link<T>* cur=head; //循鏈定位,若i為0則定位到第1個結點 while(cur != NULL && count<i) { cur=cur->next; count++; } if (cur==NULL) { return false; } else { value = cur->data; return true; } }

//source.cpp

#include <iostream> #include "lnklist.h" #include <stdio.h> using namespace std; void josephus_seq(lnkList<int>& palist, int s, int m) { int del = s; 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); //刪除出列的元素 } } int main() { lnkList<int> jos_alist; int n, s, m; printf("\n please input the values(<100) of n = "); //參與游戲的人數 scanf("%d", &n); printf("please input the values of s = "); //開始的人 scanf("%d", &s); printf("please input the values of m = "); ///單詞計數 scanf("%d", &m); for (int i=0; i<n; i++) { jos_alist.append(i+1); } josephus_seq(jos_alist, s, m); return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧洲精品一区二区三区 | 亚洲情a成黄在线观看动 | 日本高清免费网站zzzzzzzz | 成人a大片高清在线观看 | 欧美性天天| 免费亚洲网站 | 欧美亚洲日本一区二区三区浪人 | 一级美国乱色毛片 | 欧美一区二区三区视频在线观看 | 热热色视频 | 亚洲欧美精品中文字幕 | 久久精品播放 | 亚洲视频欧美 | 欧美午夜三级 | 美女享受黑人的巨茎 | 伊人免费在线观看高清版 | 日本免费不卡视频一区二区三区 | 欧美日韩高清不卡一区二区三区 | 亚洲国产成人精品不卡青青草原 | 性欧美久久 | 伊人久久久久久久久久 | 中文在线日本免费永久18近 | 国产精品96久久久久久久 | 国产综合亚洲欧美日韩一区二区 | 欧美一级成人一区二区三区 | 看亚洲人配人配人种jizz | 女网址www女影院 | 国产一级做a爰片久久毛片99 | 国产99视频精品免视看7 | a级特黄毛片免费观看 | 手机在线看片福利盒子 | 国产精品jizz观看 | xxxx欧美xxxx黑人 | 亚洲视频二区 | 最近中文字幕高清字幕在线视频 | 日本一道dvd在线中文字幕 | 成人亚洲精品一区 | 亚洲视频影院 | 亚洲伊人久久网 | 免费爱爱片 | 伊人久久免费 |