首页 > 其他分享 >链表的插入排序

链表的插入排序

时间:2024-11-07 16:45:45浏览次数:3  
标签:Node current head sortedHead 插入排序 next 链表

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

// 定义链表节点结构
typedef struct Node {
    int data;
    struct Node* next;
}Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 打印链表
void printList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

// 释放链表内存
void freeList(Node* head) {
    Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }
}

// 链表插入排序
Node* insertionSortList(Node* head) {
	Node* sortedHead;
	Node* current;
    if (head == NULL || head->next == NULL) {
        return head; // 空链表或只有一个节点的链表已经有序
    }
	sortedHead= NULL; // 排序后的链表的头节点
    current = head;

    while (current != NULL) {
        Node* nextNode = current->next; // 保存下一个节点
        Node* insertPos = sortedHead;

        // 找到插入位置
        if (sortedHead == NULL || sortedHead->data >= current->data) {
            // 插入到排序链表的头部
            current->next = sortedHead;
            sortedHead = current;
        } else {
            // 在排序链表中找到正确的插入位置
            while (insertPos->next != NULL && insertPos->next->data < current->data) {
                insertPos = insertPos->next;
            }
            current->next = insertPos->next;
            insertPos->next = current;
        }

        current = nextNode; // 处理下一个节点
    }

    return sortedHead;
}

int main() {
    // 创建链表:2 -> 35 -> 1 -> 45 -> 51 -> 3 -> 56 -> 12 -> 8 -> 5 -> NULL
	Node* sortedHead;
    Node* head = createNode(2);
    head->next = createNode(35);
    head->next->next = createNode(1);
    head->next->next->next = createNode(45);
    head->next->next->next->next = createNode(51);
    head->next->next->next->next->next = createNode(3);
    head->next->next->next->next->next->next = createNode(56);
    head->next->next->next->next->next->next->next = createNode(12);
    head->next->next->next->next->next->next->next->next = createNode(8);
    head->next->next->next->next->next->next->next->next->next = createNode(5);

    printf("排序前的链表:\n");
    printList(head);

    // 对链表进行插入排序
    sortedHead = insertionSortList(head);

    printf("排序后的链表:\n");
    printList(sortedHead);

    // 释放链表内存
    freeList(sortedHead);

    return 0;
}

修改了节点的插入方式

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

// 定义链表节点结构
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (!newNode) {
        perror("Failed to allocate memory for new node");
        exit(EXIT_FAILURE);
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}


// 插入节点到链表末尾(不进行排序)
void insertNodeAtEnd(Node** head, int data) {
    Node* newNode = createNode(data);
	Node* current;
    if (*head == NULL) {
        // 如果链表为空,新节点成为头节点
        *head = newNode;
    } else {
        // 否则,遍历到链表末尾并插入新节点
        current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

// 打印链表
void printList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

// 释放链表内存
void freeList(Node* head) {
    Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }
}

// 链表插入排序
Node* insertionSortList(Node* head) {
    Node* sortedHead = NULL; // 排序后的链表的头节点
    Node* current = head;
    Node* nextNode;
	Node* insertPos;

    while (current != NULL) {
        nextNode = current->next; // 保存下一个节点
        insertPos = sortedHead;

        // 找到插入位置
        if (sortedHead == NULL || sortedHead->data >= current->data) {
            // 插入到排序链表的头部
            current->next = sortedHead;
            sortedHead = current;
        } else {
            // 在排序链表中找到正确的插入位置
            while (insertPos->next != NULL && insertPos->next->data < current->data) {
                insertPos = insertPos->next;
            }
            current->next = insertPos->next;
            insertPos->next = current;
        }

        current = nextNode; // 处理下一个节点
    }

    return sortedHead;
}

int main() {
    // 创建链表:2 -> 35 -> 1 -> 45 -> 51 -> 3 -> 56 -> 12 -> 8 -> 5 -> NULL
    Node* head = NULL; // 使用 head 而不是 sortedHead,因为我们将对其进行排序
	Node* sortedHead;
    int values[] = {56, 3, 12, 5, 8, 35, 45, 51, 2, 1};
    int numValues = sizeof(values) / sizeof(values[0]);
    int i;
    for (i = 0; i < numValues; i++) {
        insertNodeAtEnd(&head, values[i]);
    }

    printf("排序前的链表:\n");
    printList(head);

    // 对链表进行插入排序
    sortedHead = insertionSortList(head);

    printf("排序后的链表:\n");
    printList(sortedHead);

    // 释放链表内存
    freeList(sortedHead);

    return 0;
}

标签:Node,current,head,sortedHead,插入排序,next,链表
From: https://blog.csdn.net/buwangchuxinking/article/details/143599783

相关文章

  • 链表(C 语言)
    目录一、链表的概念1.链表的结构2.链表的分类3.链表的优势二、链表的实现1.无头单项非循环链表的实现1.1代码说明2.带头双向循环链表的实现2.1代码说明三、链表和顺序表的区别四、链表总结一、链表的概念链表是一种顺序表,它由一个一个的节点组成,该节点中......
  • 【C语言】实战-力扣题库:回文链表
    题目描述给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?问题分析O(1)的时间复杂度---跟n......
  • lanqiaoOJ 1110:小王子单链表 ← 数组模拟实现
     【题目来源】https://www.lanqiao.cn/problems/1110/learning/【题目描述】小王子有一天迷上了排队的游戏,桌子上有标号为1-10的10个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把哪个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排......
  • Python——数据结构与算法-时间复杂度&空间复杂度-链表&树状结构
    1.数据结构和算法简介程序可以理解为:程序=数据结构+算法概述/目的:都可以提高程序的效率(性能)数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍概述:为了解决实际业务问题,......
  • 【LeetCode】移除链表中等于设定值的元素、反转链表
    主页:HABUO......
  • GESP4级考试语法知识(插入排序)
    #include<iostream>usingnamespacestd;constintMAXN=10001;intmain(){ intn,i,j,k; floattemp,a[MAXN]; cin>>n; for(i=1;i<=n;i++) cin>>a[i];//输入n个数 for(i=1;i<=n;i++) { for(j=i-1;j>=1;j--)//在前面有序区间为a[i]找合适的插......
  • C语言版数据结构算法(考研初试版—3)--链表定义、创建
    2、链表1、链表结构体typedefstructLNode{   intdata;   structLNode*next; }LNode,*LinkList; 2、遍历链表voidPrintList(LinkListL){   LinkListp=L->next;//Skiptheheadnodewhichisadummynode   while(p!=......
  • C语言版数据结构算法(考研初试版—4)--链表删除操作
    删除链表中值为m的结点(1)创建一个链表(2)打印删除前的链表(3)查找值为m的前一个结点(4)执行删除操作(5)打印删除后的链表#include<stdio.h>#include<stdlib.h>typedefstructLNode{ intdata; structLNode*next;}LNode,*LinkList;//头插法LinkListCreateList_L(){......
  • 代码随想录第四天|链表part02--24. 两两交换链表中的节点、19.删除链表的倒数第N个节
    资源引用:leetcode题目:24.两两交换链表中的节点(24.两两交换链表中的节点-力扣(LeetCode))19.删除链表的倒数第N个结点(19.删除链表的倒数第N个结点-力扣(LeetCode))面试题02.07.链表相交(面试题02.07.链表相交-力扣(LeetCode))142.环形链表Ⅱ(142.环形链表II-力扣(Leet......
  • C语言链表深入解析:实现与应用
    ###标题:C语言链表深入解析:实现与应用---####正文:链表是计算机科学中重要的数据结构,因其灵活性和动态性而被广泛使用。本文将探讨链表的基本概念、实现方法以及一些常见的操作,帮助你全面掌握这一基础数据结构。---###一、链表概述链表由一系列节点组成,每个节点包含数据......