Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用冒泡排序旋转链表_C_Linked List_Bubble Sort - Fatal编程技术网

C 使用冒泡排序旋转链表

C 使用冒泡排序旋转链表,c,linked-list,bubble-sort,C,Linked List,Bubble Sort,我正在尝试编写一个函数,它将用于以这种方式旋转链表:1->2->3->4,如果用户选择要向前移动3个节点的第一个节点,它将是:2->3->1->4->END(在两个节点之间切换,直到它到达第三个节点,在我看来就像气泡排序)。另一个例子:如果用户选择第二个节点作为第一个节点,它将如下所示:2->1->3->4->END 可能喜欢下面的过程。 (未经测试的伪代码) void rotateLeftOne(节点*np,int rotatelelength){ 如果(np==NULL | | np->ne

我正在尝试编写一个函数,它将用于以这种方式旋转链表:1->2->3->4,如果用户选择要向前移动3个节点的第一个节点,它将是:2->3->1->4->END(在两个节点之间切换,直到它到达第三个节点,在我看来就像气泡排序)。另一个例子:如果用户选择第二个节点作为第一个节点,它将如下所示:2->1->3->4->END

可能喜欢下面的过程。 (未经测试的伪代码)

void rotateLeftOne(节点*np,int rotatelelength){
如果(np==NULL | | np->next==NULL)
返回;
断言(旋转长度下一步;++i,np=np->next){
交换(&np->value,&np->next->value);
}
}

以下是执行所需操作所需的代码剪断。你可以。函数
void shiftNode(节点**rootNode,int nodeIndex,int shifts)
将节点移动到所需位置的代码中:

typedef struct N
{
    int val;
    struct N* next;
}Node;

/** Index starts from 0*/
void shiftNode(Node** rootNode, int nodeIndex, int shifts)
{
    int i=1;
    Node *pNode, *temp, *root = *rootNode;
    if((shifts <= 0) || (nodeIndex < 0))
    {
        return;
    }

    if(nodeIndex != 0)
    {
        for(i=1; i<nodeIndex; i++)
        {
            root = root->next;
        }
        pNode = root->next;
        root->next = pNode->next;
    }
    else
    {
        *rootNode = root->next;
        pNode = root;
        root->next = pNode->next;
    }

    for(i=0; i<shifts; i++)
    {
        root = root->next;
    }
    temp=root->next;
    root->next = pNode;
    pNode->next=temp;
}
typedef结构N
{
int-val;
结构N*next;
}节点;
/**索引从0开始*/
void shiftNode(节点**rootNode,int nodeIndex,int shifts)
{
int i=1;
Node*pNode,*temp,*root=*rootNode;
如果下一个轮班;
root->next=pNode->next;
}
其他的
{
*rootNode=root->next;
pNode=根;
root->next=pNode->next;
}
对于(i=0;不精确;
}
temp=root->next;
root->next=pNode;
pNode->next=温度;
}

这不是排序,只是简单地交换节点的位置。你通常通过重新分配正在移动的节点的指针来对列表进行排序。@Someprogrammerdude为了支持你的评论,链接列表可以通过这样一种方式来实现:它们的头部和尾部都有人工附加节点,以便删除列表中的边缘案例如果涉及的节点之一在开始或结束时进行交换。我认为这与任何排序算法都没有关系。您认为应该为链接列表输出什么:
3->1->7->10->5->12->8->end
,如果我选择将元素
7
移动2。@Saga不,我的意思是移动第三个元素(7)按两步移动。@Saga Yes!!!所以,如果我们按两步移动第三个元素(7),那么列表将是
3->1->10->5->7->12->8->END
。这是正常的移动。我的观点是:这与任何排序算法有关。因为如果我们对列表执行任何
排序算法(例如
气泡排序
),那么输出将不同(在这种情况下,第一次迭代后的输出将是
1->3->7->5->10->8->12->END
)。
typedef struct N
{
    int val;
    struct N* next;
}Node;

/** Index starts from 0*/
void shiftNode(Node** rootNode, int nodeIndex, int shifts)
{
    int i=1;
    Node *pNode, *temp, *root = *rootNode;
    if((shifts <= 0) || (nodeIndex < 0))
    {
        return;
    }

    if(nodeIndex != 0)
    {
        for(i=1; i<nodeIndex; i++)
        {
            root = root->next;
        }
        pNode = root->next;
        root->next = pNode->next;
    }
    else
    {
        *rootNode = root->next;
        pNode = root;
        root->next = pNode->next;
    }

    for(i=0; i<shifts; i++)
    {
        root = root->next;
    }
    temp=root->next;
    root->next = pNode;
    pNode->next=temp;
}