顺序表和链表的编写以及测试

 1 #include <iostream>
 2 using namespace std;
 3 int  defaultSize;
 4 template <typename E>
 5 class AList{
 6     private:
 7         int maxsize;
 8         int listsize;
 9         int curr;
10         E *listArray;
11     public:
12         AList(int size=defaultSize){
13             maxsize = size;
14             listsize = curr = 0;
15             listArray = new E[maxsize];
16         }
17         void clear(){
18             delete [] listArray;
19             listsize=curr=0;
20             listArray =new E [maxsize];
21         }
22 
23         void insert(const E &it){
24            if(listsize>maxsize)  cout<<"List capacity exceed";
25             for(int i=listsize;i>curr;i--){
26                 listArray[i] = listArray[i-1];}
27             listArray[curr]=it;
28             listsize++;
29         }
30 
31         void append(const E &it){
32             if(listsize>maxsize)  cout<<"List capacity exceed";
33             listArray[listsize++]=it;
34         }
35 
36         E remove(){
37             if(curr<0 || curr>listsize)  cout<<"wrong number";
38             E it=listArray[curr];
39             for(int i=curr;i<listsize-1;i++){
40                 listArray[i]=listArray[i+1];
41             }
42             listsize--;
43             return it;
44 
45         }
46          int length() const {return listsize;}
47          int currpos() const {return curr;}
48          void movetopos(int pos){ curr=pos;}
49          const E& getvalue(int i){
50             if(i>(listsize+1) || i<0)   cout<<"wrong number";
51             return listArray[i-1];
52          }
53          int locate(const E &it){
54              curr=0;
55              while(listArray[curr]!=it){
56                  curr++;
57              }
58              return curr+1;
59          }
60          void merge(AList L,AList L1){
61             L1.curr=0;
62             while(L1.listsize!=0){
63                 L.append(L1.listArray[L1.curr]);
64                 L1.curr++;
65                 L1.listsize--;
66             }
67             L.display();
68          }
69          void display(){
70              int curr=0;
71              while(curr!=listsize){     
72              cout<<listArray[curr]<<" ";
73              curr++;
74              }
75          };
76 };
77 void main(){
78     AList<char> L(100),L1(100);
79     L.append('a');L.append('b');L.append('c');L.append('d');
80     cout<<"创建顺序表1: ";
81     L.display();
82     int ans=L.locate('a');
83     cout<<endl<<"值为a在表中的位置: "<<ans;
84     char ans1=L.getvalue(4);
85     cout<<endl<<"位置4的值为: "<<ans1;
86     cout<<endl<<"删除第二个节点后顺序表为:";
87     L.movetopos(1);  char val=L.remove();
88     L.display();
89     L1.append('h');L1.append('i');L1.append('j');L1.append('k');
90     cout<<endl<<"创建顺序表2 : ";
91     L1.display();
92     cout<<endl<<"合并后的顺序表: ";
93     L.merge(L,L1);
94     cout<<endl;
95     system("pause");
96 };
  1 #include <iostream>
  2 using namespace std;
  3 template <typename E>
  4 class Link{
  5 public:
  6     E data;
  7     Link *next;
  8     Link(const E& elemval,Link* nextval=NULL){data=elemval;next=nextval;}
  9     Link(Link* nextval=NULL){next=nextval;}
 10 };
 11 template <typename E>
 12 class LList{
 13     private:
 14         Link<E> *head;
 15         Link<E> *tail;
 16         Link<E> *curr;
 17         int cnt;
 18     void create(){
 19         curr=head=tail=new Link<E>;
 20         cnt=0;
 21     }
 22     void removeall(){
 23         while(head!=NULL){
 24             curr=head;
 25             head=head->next;
 26             delete curr;
 27         }
 28     }
 29     public:
 30         LList(E* A,int n){
 31             create();
 32            for(int i=0;i<n;i++){
 33                  append(A[i]);
 34           }
 35         }
 36         void clear(){ removeall(); create();}
 37         void insert(const E& it){
 38             curr->next=new Link<E>(it,curr->next);
 39             if(tail==curr){  tail=curr->next;}
 40             cnt++;
 41         }
 42 
 43         void append(const E it){
 44             tail=tail->next=new Link<E>(it,NULL);
 45             cnt++;
 46         }
 47 
 48         E remove(){
 49             if(curr->next==NULL)  cout<<"NO element";
 50             E it=curr->next->element;
 51             Link<E>* temp=curr->next;
 52             if(tail==curr->next){tail=curr;}
 53             curr->next=curr->next->next;
 54             delete temp;
 55             cnt--;
 56             return it;
 57         }
 58         void movetostart(){  curr=head;}
 59         int currPos() const{
 60             Link<E> *temp=head;
 61             for(int i=0;temp!=curr;i++){
 62                 temp=temp->next;
 63             }
 64             return i;
 65         }
 66         const E getvalue(int i){
 67             Link<E> *temp=head;
 68             for(int j=0;j<i;j++){
 69                 temp=temp->next;}
 70             return temp->data;
 71         }
 72         int locate(E it){
 73             curr=head;
 74             for(int i=0;curr->next!=NULL;i++){
 75                 if(curr->data==it) return i+1;
 76                 curr=curr->next;
 77                  }
 78         }
 79         void sort(){
 80             Link<E> *p=head,*q;
 81             for(p->next;p-next!=NULL;p = p->next){
 82                 for(q=p->next;q;q = q->next){
 83                   if(p->data>q->data){
 84                       E temp;
 85                       temp=q->data;
 86                       q->data=p->data;
 87                       p->data=temp;
 88                   }
 89                 }
 90             }
 91 
 92         }
 93         void display(){
 94             curr=head;
 95             while(curr->next!=NULL){
 96                 cout<<curr->data<<" ";
 97                 curr=curr->next;
 98             }
 99         };
100 };

约瑟夫问题:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Node{
 5     public:
 6         Node(int data):data(data),link(NULL){}
 7         int data;
 8         Node *link;
 9 };
10 class Josephus{
11 public:
12     Josephus(int N, int K, int M):N(N),K(K),M(M)
13     {
14         createList();
15         outputList();
16     }
17 protected:
18      void createList();
19     void outputList();
20 private:
21     Node *m_pHead;//循环链表的头节点
22     int    N;     //链表节点个数
23     int    K;     //第一个报数猴子的序号
24     int    M;     //报数出局的数
25 };
26 void Josephus::createList(){
27     Node *pre = NULL;
28     Node *cur = NULL;
29     Node *p = new Node(1);  
30     m_pHead = p;
31     cur = p;
32     for (int i=2; i<=N; i++)
33     {
34         p = new Node(i);
35         pre = cur;
36         cur = p;
37         pre->link = cur;
38     }
39     cur->link = m_pHead;
40     int n=N;
41     p = m_pHead;
42 }
43 void Josephus::outputList()
44 {
45     Node *pre = NULL;
46     Node *cur = m_pHead;
47     K--;
48     while (K--)          
49     {
50         pre = cur;
51         cur = cur->link;
52     }
53     cout<<"依次出列的猴子编号:";
54     while (N--)            
55     {
56         int s = M-1;
57         while (s--)          
58         {
59             pre = cur;
60             cur = cur->link;
61         }
62         Node *p = cur;
63         if(N>=1)
64         cout << p->data << ",";
65         if(N==0)
66         {
67             cout<<p->data<<endl;
68            cout<<"大王是:"<<p->data<<endl;
69         }
70         cur = cur->link;    
71         pre->link = cur;
72         delete p;
73         p=NULL;
74     }
75 }
76 void main(){
77     Josephus(5,2,3);
78     system("pause");
79 }

 

posted on 2017-06-03 16:51  明静志远  阅读(161)  评论(0编辑  收藏  举报