两种方法实现链表的节点操作排序

题目:

功能: 根据单向链表的节点值和排序标识进行升降排序,并返回排序后的链表头指针。

输入: ListNode* pListHead  单向链表
unsigned int uiSortFlag  0表示按升序,1表示按降序

输出: 无

返回: 排序成功返回链表头指针,异常或未进行排序返回空指针


  说明:通过四个指针实现两个节点的交换,也即要保持该交换的节点的前后节点

源码如下:

/*
功能: 根据单向链表的节点值和排序标识进行升降排序,并返回排序后的链表头指针。

输入: ListNode* pListHead  单向链表
unsigned int uiSortFlag  0表示按升序,1表示按降序

输出: 无

返回: 排序成功返回链表头指针,异常或未进行排序返回空指针
*/

struct ListNode
{
    int       m_nKey;
	ListNode* m_pNext;
};

ListNode* SortList(ListNode* pHead, unsigned int uiSortFlag)
{
    /*需要四个节点*/
    ListNode *p;        /*要交换的节点之前的节点 */
    ListNode *prep;     /*要加换的第一个节点*/
    ListNode *temp;     /*要交换的第二个节点*/
    ListNode *tail;     /*第二个节点后的节点*/ 
    ListNode *pTempNode; /*用于指向创建的头文件*/
    ListNode pHeadNode;  /*对于没有头结点的链表,需要自己创建一个头结点,方便后面的操作*/
    pHeadNode.m_nKey = 0;
    pHeadNode.m_pNext = pHead;
    pTempNode = &pHeadNode;
    tail = (ListNode *)NULL;

    if (pHead == NULL)/
    {
        return (ListNode *)NULL;
    }
    if (uiSortFlag != 0 && uiSortFlag != 1)
    {
        return (ListNode *)NULL;
    }
    // 算法的核心部分
    switch(uiSortFlag)
    {
    case 0:
        /*关键处理部分*/
        while( pTempNode->m_pNext != tail )
        {
            prep = pTempNode;
            p = pTempNode->m_pNext;
            while( p->m_pNext != tail )
            {
                if( p->m_nKey > p->m_pNext->m_nKey )
                {
                    temp = p->m_pNext;
                    prep->m_pNext = p->m_pNext;
                    p->m_pNext = p->m_pNext->m_pNext;
                    prep->m_pNext->m_pNext = p;
                    p = temp;
                }
                // 节点后移
                p = p->m_pNext;
                prep = prep->m_pNext;
            }
            tail = p;
        }// 第一个while
        break;
    case 1:
        while( pTempNode->m_pNext != tail )
        {
            prep = pTempNode;
            p = pTempNode->m_pNext;
            while( p->m_pNext != tail )
            {
                if( p->m_nKey < p->m_pNext->m_nKey )
                {
                    temp = p->m_pNext;
                    prep->m_pNext = p->m_pNext;
                    p->m_pNext = p->m_pNext->m_pNext;
                    prep->m_pNext->m_pNext = p;
                    p = temp;
                }
                // 节点后移
                p = p->m_pNext;
                prep = prep->m_pNext;
            }
            tail = p;
        }// 第一个while
        break;
    default:
        return (ListNode *)NULL;
    }
	return pHeadNode.m_pNext;
}

int mian(int argc, char* argv[])
{
     ListNode astListNode[6];
    ListNode *pListHead;
    ListNode *pListNext;

    astListNode[0].m_nKey = 1;
    astListNode[0].m_pNext = &astListNode[1];

    astListNode[1].m_nKey = 3;
    astListNode[1].m_pNext = &astListNode[2];

    astListNode[2].m_nKey = 2;
    astListNode[2].m_pNext = &astListNode[3];

    astListNode[3].m_nKey = 1;
    astListNode[3].m_pNext = &astListNode[4];

    astListNode[4].m_nKey = 5;
    astListNode[4].m_pNext = &astListNode[5];

    astListNode[5].m_nKey = 4;
    astListNode[5].m_pNext = NULL;

    pListHead = SortList(astListNode, 1);
    return 0;
}



### 回答1: Proteus是一款电路仿真软件,可以用来模拟STM32芯片的运行。要在Proteus运行STM32程序,需要先将程序编译成HEX文件,然后将HEX文件导入到Proteus中。接下来,可以在Proteus中添加STM32芯片和其他外围设备,然后运行仿真。在仿真过程中,可以观察芯片的运行状态和外围设备的响应情况,以验证程序的正确性。 ### 回答2: Proteus是一款功能强大的电子电路设计软件,可以帮助电子工程师进行电路设计、仿真、PCB布局及自动绘制电路图等操作。运行STM32程序也是Proteus的一项特色功能。 首先,我们需要在STM32开发板上编写好程序,并将程序烧录到板子上。然后,我们需要在Proteus中找到该开发板的模型,并进行相关配置。具体步骤如下: 1. 在Proteus软件中找到STM32开发板模型,选择“Edit Component Properties”选项。 2. 在“PICmicro”下拉菜单中选择“STMicroelectronics”,然后选择“STM32F103C8T6”。 3. 点击“Configure”按钮,选择串口工具。这里假设我们选择了ST-Link调试器。 4. 点击“Edit Debug Settings”按钮,选择需要进行仿真STM32程序。 5. 完成以上步骤之后,我们就可以开始仿真了。在Proteus左侧工具栏中选择“Debug Probes”(调试探头)选项,然后双击“ST-Link Debugger”(ST-Link调试器),最后再双击“Debug”按钮。 6. 此时就可以开始进行仿真操作了,在仿真器的控制台上面看到程序运行过程。 总结来说,Proteus仿真运行STM32程序需要进行如下的步骤:烧录程序STM32板子上 -> 在Proteus中配置开发板模型和调试工具 -> 进行仿真操作 -> 观察程序运行过程。这些步骤需要逐一完成,如果没有遗漏,就可以成功运行STM32程序了。 ### 回答3: Proteus是一款常用的电路仿真软件,它可以帮助工程师在设计电路板之前先进行模拟测试,以确保电路的安全性和准确性。在Proteus中进行STM32程序仿真,需要经过以下步骤: 1. 准备STM32开发板和相应的程序代码,将代码通过开发板下载到芯片中。 2. 打开Proteus软件,在页面左侧选择“系统管理器”,然后选择“STM32器件库”,导入STM32芯片型号的库文件。 3. 从工具栏中选择“模型库”,找到“其他逻辑”模块,在“其他逻辑”模块中找到“文件操作器”模块。 4. 拖入“文件操作器”模块到界面中,双击打开,找到刚才下载到芯片中的程序代码,将其导入到“文件操作器”中。 5. 在STM32芯片上右键点击,选择“属性”,在“属性”对话框中找到“程序文件”选项,将刚才导入的程序代码关联到该选项中。 6. 在界面上点击“仿真器”,选择“ISIS”仿真器,在弹出的对话框中进行仿真器的设置。 7. 点击“运行”按钮,软件会开始仿真运行STM32程序。 以上就是在Proteus仿真运行STM32程序的具体步骤,通过这些步骤可以确保程序的正确性和可靠性,并且使得设计电路板的效率更高。当然,在进行仿真运行时,还需要注意是否存在一些硬件上的问题,需要进行相应的调整和测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值