单个链表的地址是否始终有序

时间:2014-06-28 07:16:23

标签: c++ linked-list

#include<iostream>
#include<limits>
#include<vector>

using namespace std;

struct node
{
    int num;
    struct node * next ;
};
int main()
{

    struct node *start;
    start = new node;
    start->num=-3267;
    start->next=0;
    int num;
    cout<<"Enter nums"<<endl;
    cin>>num;
    struct node * trav =start;
    for(int i=0;i<num;i++)
    {
        int a;
        trav->next=new node;
        trav=trav->next;
        cin>>a;
        trav->num=a;
        trav->next=0;
    }
    trav=start;
    struct node * temp=new node;
    trav=start->next;
    cout<<"+++++++++++++++++Simple print ++++++++++++++++++++++++++++++++++++++++++"<<endl;
    for(int i=1;i<=num;i++)
    {
        cout<<trav<<"   "<<trav->num<<endl;
        trav=trav->next;
    }
    trav = start->next;
    cout<<"++++++++++++++++++++++order used print+++++++++++++++++++++++++++++++++++++++++++"<<endl;
    for(int i=0;i<num;i++)
    {
        cout<<(trav+2*i)<<"  "<<(trav+2*i)->num<<endl;
    }

}

输出是:

Enter nums
5

1
2

3

4

5

+++++++++++++++++Simple print ++++++++++++++++++++++++++++++++

0x2c29c8   1

0x2c29d8   2

0x2c29e8   3

0x2c29f8   4

0x2c2a08   5


++++++++++++++++++++++order used print++++++++++++++++++++++++


0x2c29c8  1

0x2c29d8  2

0x2c29e8  3

0x2c29f8  4

0x2c2a08  5

3 个答案:

答案 0 :(得分:2)

没有

他们目前处于正常状态的事实是由于您正在使用的特定分配器,并且无法计算在一般情况下保留。如果在分配列表节点之间分配了其他对象,则列表地址可能看起来不同。

作为一个简单的反例,为什么列表节点不能保证在内存中有序,考虑如果你交换节点2和3会发生什么。这是一个完全合法的操作来执行链接列表,但由于您没有重新分配节点,因此他们的地址不会发生变化。所以地址不再有序。

答案 1 :(得分:0)

我认为在这种情况下碰巧是这样的,因为你没有在堆上分配任何其他东西(使用new)。您的节点最终可以在任何地方结束。

答案 2 :(得分:0)

没有。一般来说,如果在一次操作中分配和填充记录,则将按顺序分配内存。但是 NO 要求地址是连续的。假设您在链接列表中分配50个节点,然后再分配10个节点。您的前50个可能是顺序的,但如果您稍后添加节点,则可以从完全不同的内存区域进行分配。