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

       今天在看《啊哈算法》的模拟链表这一部分时发现书中的代码有一些错误。我的思考如下:

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

       

#include   
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<

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

关于《啊哈算法》模拟链表的一些思考_第1张图片


关于《啊哈算法》模拟链表的一些思考_第2张图片

关于《啊哈算法》模拟链表的一些思考_第3张图片

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


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


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

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


#include
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]

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


关于《啊哈算法》模拟链表的一些思考_第4张图片


关于《啊哈算法》模拟链表的一些思考_第5张图片


关于《啊哈算法》模拟链表的一些思考_第6张图片


你可能感兴趣的:(数据结构)