实验二 线性表综合实验

 线性表综合实验

一.实验目的

     巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。

 

二.实验时间

   准备时间为第3周到第4周,具体集中实验时间为第4周第2次课。2个学时。

 

三..实验内容

顺序表:

  1. <span style="font-size:18px;">SeqList(T score[],int n);        //构造函数,建立一个长度为n的顺序表  
  2. ~SeqList(){}                       //析构函数  
  3. void insert(int i,T x);          //插入操作,在位置i插入元素x  
  4. T Delete(int i);                   //在位置i删除对应元素  
  5. T get(int i);                         //按位查找,找位置i的元素  
  6. int locate(T x);                   //按值查找,找数值为x的元素  
  7. void print();                        //遍历操作,按序号依次输出各元素</span>

  1. /*建立一个由n个学生成绩的顺序表,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。*/  
  2.   
  3. template <typename T>  
  4. class SeqList{  
  5.     public:  
  6.         SeqList(T score[],int n);     //构造函数,建立一个长度为n的顺序表  
  7.         ~SeqList(){}                  //析构函数  
  8.         void insert(int i,T x);       //插入操作,在位置i插入元素x  
  9.         T Delete(int i);              //在位置i删除对应元素  
  10.         T get(int i);                 //按位查找,找位置i的元素  
  11.         int locate(T x);              //按值查找,找数值为x的元素  
  12.         void print();                 //遍历操作,按序号依次输出各元素  
  13.     private:  
  14.         T data[max];                  //存放数据元素的数组  
  15.         int length;                   //线性表的长度  
  16. };  
  17.   
  18. //构造函数  
  19.   
  20. template <class T>  
  21. SeqList<T>::SeqList(T score[],int n)  
  22. {  
  23.     if(n>max)throw"参数非法";  
  24.     for(int i=0;i<n;i++)  
  25.         data[i]=score[i];  
  26.     length=n;  
  27. }  
  28.   
  29. //插入操作  
  30.   
  31. template <class T>  
  32. void SeqList<T>::insert(int i,T x)  
  33. {  
  34.     int j;  
  35.     if(length>max)throw"上溢";  
  36.     if(i<1||i>=max)throw"位置非法";  
  37.     for(j=length;j>=i;j--)  
  38.         data[j]=data[j-1];  
  39.     data[i-1]=x;  
  40.     length++;  
  41. }  
  42.   
  43. //删除操作  
  44.   
  45. template <class T>  
  46. T SeqList<T>::Delete(int i)  
  47. {  
  48.     T p;int j;  
  49.     if(length==0)throw"下溢";  
  50.     if(i<1||i>=max)throw"位置非法";  
  51.     p=data[i-1];  
  52.     for(j=i;j<length;j++)  
  53.         data[j-1]=data[j];  
  54.     length--;  
  55.     return p;  
  56. }  
  57.   
  58. //查找操作  
  59.       //按位查找  
  60.   
  61. template <class T>  
  62. T SeqList<T>::get(int i)  
  63. {  
  64.     if(i<1&&i>=length)throw"查找位置非法";  
  65.     else return data[i-1];  
  66. }  
  67.   
  68.       //按值查找  
  69. template <class T>  
  70. int SeqList<T>::locate(T x)  
  71. {  
  72.     for(int i=0;i<length;i++)  
  73.         if(data[i]==x) return i+1;    //返回元素序号  
  74.         return 0;  
  75. }  
  76.   
  77. //输出操作  
  78.   
  79. template <class T>  
  80. void SeqList<T>::print()  
  81. {  
  82.     for(int i=0;i<length;i++)  
  83.         cout<<data[i]<<"  ";  
  84. }  
  85.   
  86. void main()  
  87. {  
  88.     float score[8]={95.5,78,87.5,65,100,84.5,75,69.5};  
  89.     SeqList<float> student(score,8);  
  90.     cout<<"              学生数据结构成绩"<<endl;  
  91.     student.print();  
  92.     cout<<endl<<endl<<"在位置3插入成绩66,结果如下:"<<endl;  
  93.     student.insert(3,66);  
  94.     student.print();  
  95.     cout<<endl<<endl<<"在位置5删除成绩为:"<<student.Delete(5)<<endl<<"删除后结果如下:"<<endl;  
  96.     student.print();  
  97.     cout<<endl<<endl<<"位置6的成绩为:"<<student.get(6)<<endl;  
  98.     cout<<endl<<endl<<"成绩100所在位置为:"<<student.locate(100)<<endl;  
  99. }


顺序表是线性结构,操作方便,容易理解



单链表:
  1. SeqList(T score[],int n);        //构造函数,建立一个长度为n的顺序表  
  2. ~SeqList(){}                       //析构函数  
  3. void insert(int i,T x);          //插入操作,在位置i插入元素x  
  4. T Delete(int i);                   //在位置i删除对应元素  
  5. T get(int i);                         //按位查找,找位置i的元素  
  6. int locate(T x);                   //按值查找,找数值为x的元素  
  7. void print();                        //遍历操作,按序号依次输出各元素  

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. template <typename T>  
  5. struct Node    
  6. {    
  7.     T data;    
  8.     Node<T> *next;    
  9. };  
  10.   
  11. /*建立一个由n个学生成绩的顺序表,实现数据的对表进行插入、删除、查找等操作。分别输出结果。*/  
  12.   
  13. template <typename T>  
  14. class LinkList{  
  15.     public:  
  16.         LinkList(); //无参构造函数,建立只有头结点的空链表  
  17.   
  18.         LinkList(T score[],int n);    //构造函数  
  19.   
  20.         ~LinkList()                 //析构函数  
  21.         {  
  22.             Node<T> *q;  
  23.             while(first!=NULL)  
  24.             {  
  25.                 q=first;  
  26.                 first=first->next;  
  27.                 delete q;  
  28.             }  
  29.         }  
  30.   
  31.         void insert(int i,T x); //插入操作,在位置i插入元素x  
  32.   
  33.         T Delete(int i);//删除操作,删除位置i的元素  
  34.   
  35.         T get(int i);//按位查找  
  36.   
  37.         int locate(T x); //按值查找  
  38.   
  39.         void print();//输出操作  
  40.     private:  
  41.         Node<T> *first; //头指针    
  42. };  
  43.   
  44. template<class T>    
  45. LinkList<T>::LinkList()    
  46. {    
  47.     first = new Node<T>;    
  48.     first->next = NULL;    
  49. }  
  50.   
  51. template<typename T>    
  52. LinkList<T>::LinkList(T score[],int n)  
  53. {  
  54.     Node<T>*s;  
  55.     first=new Node<T>; first->next=NULL; //初始化一个空链表  
  56.     for(int i=0;i<n;i++)  
  57.     {  
  58.         s=new Node<T>;s->data=score[i];  //为每个数组元素建立一个结点  
  59.         s->next=first->next;first->next=s;  //将结点s插入头结点之后  
  60.     }  
  61. }  
  62.   
  63. template<typename T>    
  64. void LinkList<T>::insert(int i,T x)  
  65. {  
  66.     Node<T>*p,*s;int count;  
  67.     p=first;count=0;  
  68.     while(p!=NULL&&count<i-1)  
  69.     {  
  70.         p=p->next;  
  71.         count++;  
  72.     }  
  73.     if(p==NULL)throw"位置非法";  
  74.     else{  
  75.         s=new Node<T>;s->data=x;  
  76.         s->next=p->next;p->next=s;  
  77.     }  
  78. }  
  79.   
  80.   
  81. template<typename T>    
  82. T LinkList<T>::Delete(int i)  
  83.         {  
  84.             Node<T> *q,*p; T x; int count;  
  85.             p=first;count=0; //注意P指针要指向头结点  
  86.             while(p!=NULL&&count<i-1)   //此操作目的是找到i-1个结点  
  87.             {  
  88.                 p=p->next;  
  89.                 count++;  
  90.             }  
  91.             if(p==NULL||p->next==NULL)throw"位置";  //结点p不存在或p后继结点不存在  
  92.             else{  
  93.                 q=p->next;x=q->data;  //暂存被删结点  
  94.                 p->next=q->next;  
  95.                 delete q;  
  96.                 return x;  
  97.             }  
  98.         }  
  99.   
  100. template<typename T>    
  101. T LinkList<T>::get(int i)  
  102.         {  
  103.             Node<T>*p;int count;  
  104.             p=first->next;count=1;  
  105.             while(p!=NULL&&count<i)  
  106.             {p=p->next;count++;}  
  107.             if(p==NULL)throw"位置非法";  
  108.             else return p->data;  
  109.         }  
  110.   
  111. template<typename T>    
  112. int LinkList<T>::locate(T x)  
  113.         {  
  114.             Node<T>*p;int count;  
  115.             p=first->next;count=1;  
  116.             while(p!=NULL)  
  117.             {  
  118.                 if(p->data==x)return count;  
  119.                 p=p->next;  
  120.                 count++;  
  121.             }  
  122.             return 0;  
  123.         }  
  124.   
  125. template<typename T>    
  126. void LinkList<T>::print()  
  127.         {  
  128.             Node<T>*p;  
  129.             p=first->next;  
  130.             while(p!=NULL)  
  131.             {cout<<p->data<<"  ";;  
  132.             p=p->next;  
  133.             }  
  134.         }  
  135.   
  136. void main()  
  137. {  
  138.     int score[5]={69,52,99,85,76};  
  139.     LinkList<int>student(score,5);    //创建对象  
  140.     cout<<"              学生数据结构成绩"<<endl;    
  141.     student.print();    
  142.     cout<<endl<<endl<<"在位置3插入成绩66,结果如下:"<<endl;    
  143.     student.insert(3,66);    
  144.     student.print();    
  145.     cout<<endl<<endl<<"在位置2删除成绩为:"<<student.Delete(2)<<endl<<"删除后结果如下:"<<endl;    
  146.     student.print();    
  147.     cout<<endl<<endl<<"位置3的成绩为:"<<student.get(3)<<endl;    
  148.     cout<<endl<<endl<<"成绩99所在位置为:"<<student.locate(99)<<endl;  
  149. }  
单链表由于特殊的性质比较方便

双链表:
  1. <span style="font-size:18px;">public:  
  2.         DLL();  
  3. DLL(T score[], int n);  //有参构造函数  
  4. ~DLL();  //析构函数  
  5. int Length(); //返回单链表长度  
  6. void insert(int i, T x); //插入操作,在位置i插入元素  
  7. T get(int i);  //按位查找  
  8. int locate(T x);  //按值查找  
  9. T Delete(int i);  //删除操作  
  10. void print();  //遍历操作  
  11. private:  
  12. Node<T> *first;  //双链表的头指针  
  13. int length;   //链的长度计数</span>  
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. template <typename T>  
  5. class  Node  
  6. {  
  7. public:  
  8.     T data;  
  9.     Node<T> *prior;  
  10.     Node<T> *next;  
  11. };  
  12.   
  13. template <typename T>  
  14. class DLL {  
  15. public:  
  16.     DLL();  
  17.     DLL(T score[], int n);  //有参构造函数  
  18.     ~DLL();  //析构函数  
  19.     int Length(); //返回单链表长度  
  20.     void insert(int i, T x); //插入操作,在位置i插入元素  
  21.     T get(int i);  //按位查找  
  22.     int locate(T x);  //按值查找  
  23.     T Delete(int i);  //删除操作  
  24.     void print();  //遍历操作  
  25. private:  
  26.     Node<T> *first;  //双链表的头指针  
  27.     int length;   //链的长度计数  
  28. };  
  29.   
  30. template <typename T>  
  31. DLL<T>::DLL(T score[], int n)  
  32. {  
  33.     length=0;  
  34.     first = new Node<T>;  
  35.     first->next = NULL;  
  36.     first->prior = NULL;  
  37.     for (int i = 0; i<n; i++)  
  38.     {  
  39.         Node<T> *s = new Node<T>;  
  40.         s->data = score[i];  
  41.         s->next = first->next;   
  42.         first->next = s;  
  43.     }  
  44. }  
  45.   
  46. template <typename T>  
  47. DLL<T>::~DLL()  
  48. {  
  49.     while (first->next!=first->prior)  
  50.     {  
  51.         //临时指针,存储即将释放的节点的指针  
  52.         Node<T> *temp = first;  
  53.         //脱链  
  54.         first->prior->next = first->next;  
  55.         first->next -> prior = first->prior;  
  56.         //头指针后移  
  57.         first = first->next;  
  58.         //释放内存  
  59.         delete temp;  
  60.     }  
  61.     delete first;  
  62. }  
  63.   
  64. template<typename T>  
  65. int DLL<T>::Length()  
  66. {  
  67.     Node<T> *p; int count;  
  68.     p=first->next;    
  69.     count=0;    
  70.     while(p!=NULL)  
  71.     {    
  72.         p=p->next;    
  73.         count++;    
  74.      }    
  75.     return length;  
  76. }  
  77.   
  78. template <typename T>  
  79. void DLL<T>::insert(int i,T x)  
  80. {  
  81.     Node<T>*p,*s;int count;    
  82.     p=first;     
  83.     count=0;    
  84.     while(p!=NULL&&count<i-1)    
  85.     {    
  86.         p=p->next;    
  87.         count++;            
  88.      }    
  89.      if(p==NULL) throw"位置";    
  90.      else  
  91.      {    
  92.        s=new Node<T>;    
  93.        s->data=x;    
  94.        s->next=p->next;    
  95.        p->next=s;    
  96.      }  
  97. }  
  98.   
  99. template <typename T>  
  100. T DLL<T>::get(int i)  
  101. {  
  102.     Node<T> *p;int count; count = 1;  
  103.     p = first->next;   
  104.     while (p != NULL&&count<i)  
  105.     {  
  106.         p = p->next; count++;  
  107.     }  
  108.     if (p == NULL)throw"位置非法";  
  109.     else return p->data;  
  110. }  
  111.   
  112. template <typename T>  
  113. int DLL<T>::locate(T x)  
  114. {  
  115.     Node<T> *p; int count;  
  116.     p = first->next; count = 1;  
  117.     while (p!= NULL)  
  118.     {  
  119.         if (p->data == x) return count;  
  120.         p = p->next;  
  121.         count++;  
  122.     }  
  123.     return 0;  
  124. }  
  125.   
  126. template <typename T>  
  127. T DLL<T>::Delete(int i)  
  128. {  
  129.     Node<T> *p,*q;  
  130.     p = first->next; int count, x; count = 1;  
  131.     while (p != NULL&&count<i-1)  
  132.     {  
  133.         p = p->next; count++;  
  134.     }  
  135.     if (p == NULL || p->next == NULL) throw"位置非法";  
  136.     else  
  137.     {    
  138.         q = p->next;    
  139.         x=q->data;    
  140.         if (p->next != NULL)  
  141.         {    
  142.             if(q->next!=NULL)    
  143.         q->next->prior = p;  
  144.             else  
  145.             {  
  146.                 p->next=NULL;  
  147.                 p->next = q->next;  
  148.                 delete q;  
  149.                 q = NULL;  
  150.                 return x;  
  151.             }  
  152.         }  
  153.         p->next = q->next;  
  154.         delete q;    
  155.         q = NULL;    
  156.         return x;  
  157.     }  
  158. }  
  159.   
  160. template <typename T>  
  161. void DLL<T>::print()  
  162. {  
  163.     Node<T> *p;  
  164.     p = first->next;  
  165.     while (p->next != NULL)  
  166.     {  
  167.         cout << p->data << " ";  
  168.         p = p->next;  
  169.     }  
  170.     cout << p->data << endl;  
  171. }  
  172.   
  173. void main()  
  174. {  
  175.     float score[8] = { 66.5,89.5,95,74.5,32.5,68,100,86.5 };  
  176.     DLL<float>student(score, 8);  
  177.     cout << "     学生数据结构成绩" << endl;  
  178.     student.print();  
  179.     cout << endl << endl << "在位置3插入成绩78,插入后结果如下:" << endl;  
  180.     student.insert(3,66);  
  181.     student.print();  
  182.     cout << endl << endl << "在位置2删除成绩为:" << student.Delete(2) <<" , "<< "删除后结果如下:" << endl;  
  183.     student.print();  
  184.     cout << endl << endl << "位置3的成绩为:" << student.get(3) << endl;  
  185.     cout << endl << endl << "成绩32.5所在位置为:" << student.locate(32.5) << endl;  
  186. }  

双链表相比单链表更加完善。

静态链表:
  1. public:    
  2.     SLL();//无参构造函数    
  3.     SLL(T score[],int n);//带参构造函数    
  4.     virtual ~SLL();//空的析构函数      
  5.     void print();//遍历操作   
  6.     T get(int i);//按位查找操作  
  7.     int Locate(T x);//按值查找操作  
  8.     void insert(int i, T x);//插入操作  
  9.     void Delete(int i);//删除操作  
  10. private:    
  11.     Node<T> node[Maxsize];//节点    
  12.     int first;    
  13.     int avail;//指向空闲链的头指针    
  14.     int length;//当前静态链表的长度  
  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4.   
  5. //静态链表的储存结构  
  6. const int Maxsize = 100;  
  7. template<typename T>  
  8. class Node {  
  9. public:  
  10.     T data;  
  11.     int next;      //存储指向下一个节点的数组下标  
  12. };  
  13.   
  14. template <typename T>    
  15. class SLL {    
  16. public:    
  17.     SLL();//无参构造函数    
  18.     SLL(T score[],int n);//带参构造函数    
  19.     virtual ~SLL();//空的析构函数      
  20.     void print();//遍历操作   
  21.     T get(int i);//按位查找操作  
  22.     int Locate(T x);//按值查找操作  
  23.     void insert(int i, T x);//插入操作  
  24.     void Delete(int i);//删除操作  
  25. private:    
  26.     Node<T> node[Maxsize];//节点    
  27.     int first;    
  28.     int avail;//指向空闲链的头指针    
  29.     int length;//当前静态链表的长度  
  30. };  
  31.   
  32. template<typename T>  
  33. SLL<T>::SLL(T score[],int n)  
  34. {  
  35.     length = 0;  
  36.     for(int i = 0; i<Maxsize; i++)  
  37.     {  
  38.         node[i].next=i+1;  
  39.     }  
  40.     node[Maxsize - 1].next = -1;    
  41.     avail = 2;    
  42.     first = 1;    
  43.     node[first].next = -1;    
  44.     for (int j = n-1; j >=0; j--)    
  45.     {    
  46.         if (avail == -1)    
  47.         {    
  48.             break;    
  49.         }    
  50.         int s = avail;    
  51.         avail = node[avail].next;//空闲链的头指针后移    
  52.         node[s].data = score[j];//将score[j]填入下标为S的节点    
  53.         node[s].next = node[first].next;//将score[j]插到first后面    
  54.         node[first].next = s;    
  55.         length++;    
  56.     }    
  57. }  
  58. template<class T>    
  59. SLL<T>::~SLL()    
  60. {    
  61. }  
  62.   
  63. template<typename T>  
  64. void SLL<T>::print()  
  65. {  
  66.     int s = node[first].next;  
  67.     for (int i = 1; i <= length; i++)  
  68.     {  
  69.         cout << node[s].data << " ";  
  70.         s = node[s].next;  
  71.     }  
  72. }     
  73.   
  74. template<typename T>  
  75. T SLL<T>::get(int i)  
  76. {  
  77.     if(i<=0 || i>length) throw"位置非法";  
  78.     int p = first;  
  79.     for(int j = 0; j<i; j++)  
  80.     {  
  81.         p=node[p].next;  
  82.     }  
  83.     return node[p].data;  
  84. }  
  85.   
  86. template<typename T>  
  87. int SLL<T>::Locate(T x)  
  88. {  
  89.     int count=0;  
  90.     int p = first;  
  91.     while(node[p].next != -1)  
  92.     {  
  93.         p=node[p].next;  
  94.         if(node[p].data == x) return count+1;  
  95.         count++;  
  96.     }  
  97.     return -1;  
  98. }  
  99.   
  100. template<typename T>  
  101. void SLL<T>::insert(int i, T x)  
  102. {  
  103.     if(i<0||i>length) throw"位置非法";  
  104.     int p = first;  
  105.     for(int j = 1; j<i; j++)  
  106.     {   p=node[p].next;    /*或者p=node[p].next*/}  
  107.     int s = node[avail].next;  
  108.     node[avail].data = x;    
  109.     node[avail].next = node[p].next;    
  110.     node[p].next = avail;    
  111.     avail = s;    
  112.     length++;  
  113. }  
  114.   
  115. template<typename T>  
  116. void SLL<T>::Delete(int i)  
  117. {  
  118.     if(i<0||i>length+1) throw"位置非法";  
  119.     int p = first;  
  120.     for(int j = 1;j<=i; j++)  
  121.     {    p=node[p].next;  }  
  122.     int q = node[p].next;    
  123.     T e = node[p].data;    
  124.     node[p].next = node[q].next;    
  125.     node[q].next = avail;    
  126.     avail = q;    
  127.     length--;  
  128. }  
  129.   
  130. void main()    
  131. {    
  132.     float score[5]={95.7,68.2,37.8,84.5,76.5};    
  133.     SLL<float> student(score,5);    
  134.     cout<<"              学生数据结构成绩"<<endl;    
  135.     student.print();    
  136.     cout<<endl<<endl<<"在位置3插入成绩66,结果如下:"<<endl;    
  137.     student.insert(3,66);    
  138.     student.print();    
  139.     cout<<endl<<endl<<"在位置4删除成绩   删除后结果如下:"<<endl;  
  140.     student.Delete(3);  
  141.     student.print();    
  142.     cout<<endl<<endl<<"位置2的成绩为:"<<student.get(2)<<endl;    
  143.     cout<<endl<<endl<<"成绩68.2所在位置为:"<<student.Locate(68.2)<<endl;    
  144. }
静态链表使用数组来表示单链表,属于静态存储

间接寻址:
  1. public:  
  2.         inadd();//无参构造函数  
  3.         inadd(T score[],int n);//有参构造函数  
  4.         virtual ~inadd();//析构函数  
  5.         void print();//遍历操作  
  6.         T get(int i);//按位查找操作  
  7.         int Locate(T x);//按值查找操作  
  8.         void insert(int i,T x);//插入操作  
  9.         T Delete(int i);//删除操作  
  10.         bool changeList(int i, T x);  //改变某一结点的值 i为节点的位置,x为替换的值  
  11.     private:  
  12.         Node<T> *first; //头指针  
  13.         int length; //结点数量  
  14.         Node<T> *address[Maxsize];  //结点指针数组  
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. const int Maxsize = 100;  
  5.   
  6. template<typename T>  
  7. struct Node {  
  8.     T data;  
  9.     Node<T> *next;  
  10. };  
  11.   
  12. template<typename T>  
  13. class inadd{  
  14.     public:  
  15.         inadd();//无参构造函数  
  16.         inadd(T score[],int n);//有参构造函数  
  17.         virtual ~inadd();//析构函数  
  18.         void print();//遍历操作  
  19.         T get(int i);//按位查找操作  
  20.         int Locate(T x);//按值查找操作  
  21.         void insert(int i,T x);//插入操作  
  22.         T Delete(int i);//删除操作  
  23.         bool changeList(int i, T x);  //改变某一结点的值 i为节点的位置,x为替换的值  
  24.     private:  
  25.         Node<T> *first; //头指针  
  26.         int length; //结点数量  
  27.         Node<T> *address[Maxsize];  //结点指针数组  
  28. };  
  29.   
  30. template<typename T>  
  31. inadd<T>::inadd()  
  32. {  
  33.     first=new Node<T>;  
  34.     first->next=NULL;  
  35. }  
  36.   
  37. template<typename T>  
  38. inadd<T>::inadd(T score[],int n)  
  39. {  
  40.     if (n > Maxsize) throw("溢出");  
  41.     Node<T> *s;  
  42.     first = new Node<T>;first->next=NULL; //初始化一个空链表    
  43.     for(int i=n-1;i>=0;i--)    
  44.     {    
  45.         s=new Node<T>;s->data=score[i];  //为每个数组元素建立一个结点    
  46.         s->next=first->next;first->next=s;  //将结点s插入头结点之后    
  47.     }  
  48. }  
  49.   
  50. template<typename T>  
  51. inadd<T>::~inadd()                 //析构函数    
  52. {  
  53.     Node<T> *q;  
  54.     while(first!=NULL)  
  55.     {  
  56.         q=first;  
  57.         first=first->next;  
  58.         delete q;  
  59.     }  
  60. }    
  61.   
  62. template<typename T>      
  63. void inadd<T>::insert(int i,T x)    
  64. {    
  65.     Node<T>*p,*s;int count;    
  66.     p=first;count=0;    
  67.     while(p!=NULL&&count<i-1)    
  68.     {    
  69.         p=p->next;    
  70.         count++;    
  71.     }    
  72.     if(p==NULL)throw"位置非法";  
  73.     s=new Node<T>;s->data=x;  
  74.     s->next=p->next;  
  75.     p->next=s;  
  76.     length++;  
  77. }  
  78.   
  79. template<typename T>      
  80. T inadd<T>::Delete(int i)  
  81. {  
  82.     Node<T> *q,*p; T x; int count;    
  83.     p=first;count=0; //注意P指针要指向头结点    
  84.     while(p!=NULL&&count<i-1)   //此操作目的是找到i-1个结点  
  85.     {  
  86.         p=p->next;  
  87.         count++;    
  88.     }  
  89.     if(p==NULL||p->next==NULL)throw"位置";  //结点p不存在或p后继结点不存在  
  90.     else{  
  91.         q=p->next;x=q->data;  //暂存被删结点    
  92.         p->next=q->next;    
  93.         delete q;    
  94.         return x;  
  95.     }  
  96. }    
  97.     
  98. template<typename T>      
  99. T inadd<T>::get(int i)    
  100. {  
  101.     Node<T>*p;int count;  
  102.     p=first->next;count=1;  
  103.     while(p!=NULL&&count<i)  
  104.     {p=p->next;count++;}  
  105.     if(p==NULL)throw"位置非法";  
  106.     else return p->data;  
  107. }    
  108.     
  109. template<typename T>      
  110. int inadd<T>::Locate(T x)    
  111.         {    
  112.             Node<T>*p;int count =1;    
  113.             p=first->next;    
  114.             while(p!=NULL)    
  115.             {    
  116.                 if(p->data==x)return count;    
  117.                 p=p->next;    
  118.                 count++;    
  119.             }    
  120.             return 0;    
  121.         }    
  122.     
  123. template<typename T>      
  124. void inadd<T>::print()    
  125.         {    
  126.             Node<T>*p;    
  127.             p=first->next;    
  128.             while(p!=NULL)    
  129.             {cout<<p->data<<"  ";;    
  130.             p=p->next;    
  131.             }    
  132.         }  
  133.   
  134. void main()    
  135. {    
  136.     float score[5]={69.3,52.6,99,85.7,76.9};    
  137.     inadd<float>student(score,5);    //创建对象    
  138.     cout<<"              学生数据结构成绩"<<endl;      
  139.     student.print();      
  140.     cout<<endl<<endl<<"在位置3插入成绩66,结果如下:"<<endl;      
  141.     student.insert(3,66);      
  142.     student.print();      
  143.     cout<<endl<<endl<<"在位置2删除成绩为:"<<student.Delete(2)<<endl<<"删除后结果如下:"<<endl;      
  144.     student.print();      
  145.     cout<<endl<<endl<<"位置3的成绩为:"<<student.get(3)<<endl;      
  146.     cout<<endl<<endl<<"成绩76.9所在位置为:"<<student.Locate(76.9)<<endl;    
  147. }  

间接寻址也利用了数组,属于随机存储。


总结:

俗话说“实践是检验真理的唯一标准”。在课堂上短短的学习时间,并不能很好地对所学知识有很好的理解,相反,我们更需要在课后多花时间上机实验,才能更大程度地掌握所学知识的原理。

实验完成后,我们不能就此满足,更应该多花时间课后多看书,多理解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值