数组如何模拟链表

来源:互联网 发布:手机隔墙听软件 编辑:程序博客网 时间:2024/06/05 10:30

模拟链表:

和链表相似,只不过将链表的next域用一个数组表示。数组data用来存放具体数字,而另一个数组right用来存放当前序列中每一个元素右边的元素在数组data中的位置。

例如:

data数组:(从1开始存储,0位置空着)
                   序号 :  1       2       3      4       5        6
                     值  :  4       6       3      7       9        0  
right数组:
                   
                  序号 :  1       2       3      4       5        6
                    值  :  5       3       0      6       4        2  

说明:
从right数组中可以看出:
1号元素右边元素在5号位置,即:2号 = data[5] = 9    
而5号位置右边的元素在4号位置,即:3号 = data[right[5]]  =  data[4] =   7
。。。。。。
需要注意的是,3位置右边元素在0位置上,意味着结束

到最后我们就可以找到整个链表连起来的元素了:

4  9  7  0  6  3

那如果想在7后面插入元素10呢

新链表:4  9  7  10  0   6   3

那么可以这样做:

data数组:(从1开始存储,0位置空着)
                   序号 :  1       2       3      4       5        6    7
                     值  :  4       6       3      7       9        0    10
right数组:
                   
                  序号 :  1       2       3      4       5        6    7
                    值  :  5       3       0      7       4        2    6

就是要在data数组后面直接添加一个元素10,然后查找right数组,直到找到7元素,位置为4,将data[4]修改为7,
再添加一个元素为data[4](之前的值)


数组模拟的链表也可以实现排序,下面给出了排序的代码实现:

[cpp] view plain copy
 print?
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.    int data[101],right[101];  
  7.    int i,n,t,len;  
  8.    //读入已有的数据  
  9.    cin>>n;  
  10.    for(i=1;i<=n;i++)  
  11.     cin>>data[i];  
  12.    len=n;  
  13.    //初始化数组right  
  14.    for(i=1;i<=n;i++)  
  15.    {  
  16.        if(i!=n)  
  17.         right[i]=i+1;  
  18.        else  
  19.         right[i]=0;  
  20.    }  
  21.    //直接在数组data的末尾增加一个数  
  22.    len++;  
  23.    cin>>data[len];  
  24.    //从链表的头部开始遍历  
  25.    t=1;  
  26.    while(t!=0)  
  27.    {  
  28.        if(data[right[t]]>data[len])   //找到要插入的节点的位置  
  29.        {  
  30.            right[len]=right[t];    //新插入节点的下一个节点即为当前节点的下一个节点  
  31.            right[t]=len;            //当前节点的下一个节点为新插入节点  
  32.            break;  
  33.        }  
  34.        t=right[t];       //构成循环,相当于链表中的p=p->next  
  35.    }  
  36.    //输出链表中的所有的数  
  37.    t=1;  
  38.    while(t!=0)  
  39.    {  
  40.        cout<<data[t]<<" ";  
  41.        t=right[t];  
  42.    }  
  43.     cout<<endl;  
  44.     return 0;  
  45. }  

运行结果:


0
原创粉丝点击