关于《啊哈算法》模拟链表的一些思考

来源:互联网 发布:网络言情小说女作家 编辑:程序博客网 时间:2024/05/21 08:48
       今天在看《啊哈算法》的模拟链表这一部分时发现书中的代码有一些错误。我的思考如下:

       所谓模拟链表,就是用两个数组去模拟一个链表,书中给我们的解决方案是用一个data数组存放数据,用一个right数组去存放序列中每一个元素右边的元素在data数组中的位置。想法很简单,按照书中的C代码修改出的C++代码如下:

       

#include <iostream>  using namespace std;    int main()  {     int data[101],right[101];     int i,n,t,len;     cin>>n;     for(i=1;i<=n;i++)      cin>>data[i];     len=n;      for(i=1;i<=n;i++)     {         if(i!=n)          right[i]=i+1;         else          right[i]=0;     }     len++;     cin>>data[len];      t=1;     while(t!=0)     {         if(data[right[t]]>data[len])          {             right[len]=right[t];                right[t]=len;                      break;         }         t=right[t];         }     t=1;     while(t!=0)     {         cout<<data[t]<<" ";         t=right[t];     }      cout<<endl;      return 0;  } 

用Dev-CPP运行的结果如下:





观察运行结果,会发现,当待插入的数比最小的数小,比最大的数大都得不到正确大的运行结果。究其原因主要是因为如下代码:


t=1;     while(t!=0)     {         if(data[right[t]]>data[len])          {             right[len]=right[t];                right[t]=len;                      break;         }         t=right[t];         }  


在这段代码中,直接比较了当前结点的下一个结点的值与待插入的数的大小,也就是说,无论怎么比,都是从第二个元素与待插入的值进行比较,并且,在这段大的结构执行完过后,程序直接对链表中的数进行了输出。这样做就漏考虑了待插入的数比原来链表中的数都大的情况,所以程序会出错。

对源代码进行了一点修正,程序如下:


#include<iostream>using namespace std;int main(){int n,i,b,t;cin>>n;int node[1000],right[1000];for(i=1;i<=n;i++){cin>>node[i];   }  for(i=0;i<=n-1;i++)  {  right[i]=i+1;  }  right[n]=-1;  cin>>b;  node[n+1]=b;  for(i=1;i<=n;i++)  {  if(node[i]>=b)  {  right[n+1]=right[i-1];  right[i-1]=n+1;            break;  }  }  if(node[n]<b)  {  right[n+1]=-1;  right[n]=n+1;  }  t=0;  while(t!=-1)  {  t=right[t];  if(t!=-1)  cout<<node[t]<<" ";  }  return 0;}

我的代码是用空出来的right[0]来保存第一个结点的位置,并且比较当前元素和待插入元素的大小,增加了当待插入的元素比链表中的数都大的情况的处理。程序运行结果如下:








0 0