在C语言中随机化链表

在C语言中随机化链表,c,random,linked-list,C,Random,Linked List,假设我在C程序的内存中有一个保留空间,用于包含1000项的链表。每个项只包含列表中下一项的引用(最后一项指向第一项)。但现在它们都设置为null,这只是保留的空间 接下来我有一个rand()函数,它给我一个从1到1000的随机数。我的问题是,有没有简单的方法可以用这个函数按如下方式随机排列这个列表:当我从第一个元素开始时,我将遍历整个列表,也就是说,列表中不会有比整个列表小的圆。根据您的描述,您有一个1000个节点的数组,所有节点都为零。为了便于讨论,该数组名为node\u array,链接字段

假设我在C程序的内存中有一个保留空间,用于包含1000项的链表。每个项只包含列表中下一项的引用(最后一项指向第一项)。但现在它们都设置为null,这只是保留的空间


接下来我有一个
rand()
函数,它给我一个从1到1000的随机数。我的问题是,有没有简单的方法可以用这个函数按如下方式随机排列这个列表:当我从第一个元素开始时,我将遍历整个列表,也就是说,列表中不会有比整个列表小的圆。

根据您的描述,您有一个1000个节点的数组,所有节点都为零。为了便于讨论,该数组名为
node\u array
,链接字段名为
next
。您还有一个名为
head
的指针,可以指向其中一个节点

您可以分配1000个整数的数组:

enum { NUM_ITEMS = 1000 };
int mapper[NUM_ITEMS];
您可以初始化列表,使每个数字显示一次:

for (int i = 0; i < NUM_ITEMS; i++)
    mapper[i] = i;

瞧…

根据您的描述,您有一个1000个节点的数组,所有节点都归零。为了便于讨论,该数组名为
node\u array
,链接字段名为
next
。您还有一个名为
head
的指针,可以指向其中一个节点

您可以分配1000个整数的数组:

enum { NUM_ITEMS = 1000 };
int mapper[NUM_ITEMS];
您可以初始化列表,使每个数字显示一次:

for (int i = 0; i < NUM_ITEMS; i++)
    mapper[i] = i;

等等……不需要额外空间的解决方案。尽管请注意,
rand()
被称为每个节点分配的随机次数:

struct Node
{
    Node* next;
};

int main()
{   
    Node nodes[1000];
    Node* pNext = NULL; 
    Node* pHead = NULL; 
    Node* pTail = NULL;
    int i = 0;
    // reset .next to NULL
    memset(nodes, 0, sizeof(nodes));
    srand ( time(NULL) );
    pHead = &nodes[ rand() % (1000)];           
    pTail = pHead;
    // need only 999 runs as one node is already assigned
    for (i = 0; i < 999; ++i)
    {   
        pTail->next = pTail;
        while ((pNext = &nodes[ rand() % (1000)]) && pNext->next);
        pTail->next = pNext;
        pTail = pNext;
    }
    // pTail->next = pHead; // uncomment if you need circular list
}
struct节点
{
节点*下一步;
};
int main()
{   
节点[1000];
Node*pNext=NULL;
Node*pHead=NULL;
Node*pTail=NULL;
int i=0;
//重置。在NULL旁边
memset(节点,0,sizeof(节点));
srand(时间(空));
pHead=&节点[rand()%(1000)];
pTail=pHead;
//只需要999次运行,因为已经分配了一个节点
对于(i=0;i<999;++i)
{   
pTail->next=pTail;
while((pNext=&nodes[rand()%(1000)])&&pNext->next);
pTail->next=pNext;
pTail=pNext;
}
//pTail->next=pHead;//如果需要循环列表,请取消注释
}

不需要额外空间的解决方案。尽管请注意,
rand()
被称为每个节点分配的随机次数:

struct Node
{
    Node* next;
};

int main()
{   
    Node nodes[1000];
    Node* pNext = NULL; 
    Node* pHead = NULL; 
    Node* pTail = NULL;
    int i = 0;
    // reset .next to NULL
    memset(nodes, 0, sizeof(nodes));
    srand ( time(NULL) );
    pHead = &nodes[ rand() % (1000)];           
    pTail = pHead;
    // need only 999 runs as one node is already assigned
    for (i = 0; i < 999; ++i)
    {   
        pTail->next = pTail;
        while ((pNext = &nodes[ rand() % (1000)]) && pNext->next);
        pTail->next = pNext;
        pTail = pNext;
    }
    // pTail->next = pHead; // uncomment if you need circular list
}
struct节点
{
节点*下一步;
};
int main()
{   
节点[1000];
Node*pNext=NULL;
Node*pHead=NULL;
Node*pTail=NULL;
int i=0;
//重置。在NULL旁边
memset(节点,0,sizeof(节点));
srand(时间(空));
pHead=&节点[rand()%(1000)];
pTail=pHead;
//只需要999次运行,因为已经分配了一个节点
对于(i=0;i<999;++i)
{   
pTail->next=pTail;
while((pNext=&nodes[rand()%(1000)])&&pNext->next);
pTail->next=pNext;
pTail=pNext;
}
//pTail->next=pHead;//如果需要循环列表,请取消注释
}

你的随机数在这里有什么用?听起来很简单-你尝试过什么?我应该用它来随机列表。但是我不知道怎么。。。天真的方法是按顺序遍历项目,并将此数字用作“next”元素的索引。但是很有可能两个项目会指向同一个项目。你的随机数在这里有什么用?听起来很简单-你尝试过什么?我应该用它来随机列表。但是我不知道怎么。。。天真的方法是按顺序遍历项目,并将此数字用作“next”元素的索引。但有很大的机会,两个项目将指向同一个项目。这似乎是我想做的。谢谢:-)再次检查0..999对1..1000,并注意一个一个的错误。未经测试的代码!你刚刚被警告过。是的,我只是想知道怎么做。我会测试的,谢谢。这似乎是我想要做的。谢谢:-)再次检查0..999对1..1000,并注意一个一个的错误。未经测试的代码!你刚刚被警告过。是的,我只是想知道怎么做。我来测试一下,谢谢。