基于链表的插入排序

本文介绍了一个使用C语言实现的简单链表排序程序。通过创建两个链表并对其中一个进行输入,然后将输入链表的数据按升序插入到另一个空链表中实现排序。最后输出排序前后的链表数据。
使用C语言实现,直接上代码
//
//  main.c
//  LinkTest
//
//  Created by 朱坤 on 16/3/20.
//  Copyright © 2016年 zhukun. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node* Link;
struct Node{
    int item;
    Link next;
}heada, headb;

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d", &n);
    Link p, q, temp;
    p = &heada;
    
    while(n--){
        Link t = malloc(sizeof(t));
        scanf("%d", &(t->item));
        t->next = NULL;
        p->next = t;
        p = t;
    }
    
    p = &heada;
    printf("原序列为:");
    while(p->next!=NULL){
        printf("%d ",p->next->item);
        p = p->next;
    }
   
    for(p = heada.next; p != NULL; p = temp){
        temp = p->next;
        for(q = &headb; q->next != NULL; q=q->next){
            if(p->item < q->next->item) break;
        }
        p->next = q->next;
        q->next = p;
    }
    printf("\n排序后为:");
    p = &headb;
    while(p->next!=NULL){
        printf("%d ",p->next->item);
        p = p->next;
    }
    
}

提供了一个基于51单片机的RFID门禁系统的完整资源文件,包括PCB图、原理图、论文以及源程序。该系统设计由单片机、RFID-RC522频射卡模块、LCD显示、灯控电路、蜂鸣器报警电路、存储模块和按键组成。系统支持通过密码和刷卡两种方式进行门禁控制,灯亮表示开门成功,蜂鸣器响表示开门失败。 资源内容 PCB图:包含系统的PCB设计图,方便用户进行硬件电路的制作和调试。 原理图:详细展示了系统的电路连接和模块布局,帮助用户理解系统的工作原理。 论文:提供了系统的详细设计思路、实现方法以及测试结果,适合学习和研究使用。 源程序:包含系统的全部源代码,用户可以根据需要进行修改和优化。 系统功能 刷卡开门:用户可以通过刷RFID卡进行门禁控制,系统会自动识别卡片并判断是否允许开门。 密码开门:用户可以通过输入预设密码进行门禁控制,系统会验证密码的正确性。 状态显示:系统通过LCD显示屏显示当前状态,如刷卡成功、密码错误等。 灯光提示:灯亮表示开门成功,灯灭表示开门失败或未操作。 蜂鸣器报警:当刷卡或密码输入错误时,蜂鸣器会发出报警声,提示用户操作失败。 适用人群 电子工程、自动化等相关专业的学生和研究人员。 对单片机和RFID技术感兴趣的爱好者。 需要开发类似门禁系统的工程师和开发者。
### 链表插入排序算法原理 链表插入排序是一种简单直观的排序方法,适用于单向或双向链表。该算法通过构建有序序列来实现整个列表的排序,在每一步中从未排序部分取出一个节点,并将其放置于已排序部分中的合适位置。 #### 算法过程 每次迭代时,选取未排序区域的第一个节点作为当前处理对象。对于这个节点: - 将其从原位置摘下; - 寻找已在排序区域内应插入的具体位置; - 完成插入操作; 上述动作持续执行直至遍历完整个链表[^4]。 #### 关键特性 由于链表内部元素之间存在指针连接关系而非连续内存空间布局,因此相比于基于数组实现的传统插入排序方式,链表版本不需要频繁搬移其他成员即可调整顺序,从而提高了效率[^2]。 #### 实现细节 以下是Python语言下的伪代码表示形式用于演示如何具体实施这一策略: ```python def insertionSort(head): if not head or not head.next: return head dummyHead = ListNode(0) dummyHead.next = head current_node = head while current_node and current_node.next: if current_node.val <= current_node.next.val: current_node = current_node.next else: node_to_insert = current_node.next prev = dummyHead # Find the correct position to insert `node_to_insert`. while prev.next.val < node_to_insert.val: prev = prev.next # Insert `node_to_insert` between `prev` and `prev.next`. temp_next = node_to_insert.next node_to_insert.next = prev.next prev.next = node_to_insert current_node.next = temp_next return dummyHead.next ``` 此函数接收指向链表头部的一个引用参数head,并返回经过升序排列后的新的头结点地址。注意这里引入了一个虚拟头节点dummyHead以便简化边界条件判断逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值