Qsort对链表指针排序

2024-06-09 21:08
文章标签 指针 链表 排序 qsort

本文主要是介绍Qsort对链表指针排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数组元素为head头指针

头指针是结构体指针

  • 排序方式:
  • 链表元素少的排前面
  • 元素个数相同的按字典序排序

Qsort 只能对连续的元素排序

#include <stdio.h>
#include <stdlib.h>typedef struct TagNode{int data;struct TagNode *next;
}Node;Node *CreateLink(int *arr, int n)
{Node *head = (Node *)malloc(sizeof(Node));head->data = *arr;Node *rear = head;Node *temp;for (int i = 1; i < n; ++i) {temp = (Node *)malloc(sizeof(Node));temp->data = *(arr + i);temp->next = NULL;rear->next = temp;rear = rear->next;}return head;
}int GetLinkLen(Node *head)
{int len = 0;Node *temp = head;while(temp){len++;temp = temp->next;}return len;
}int cmp(const void *head1, const void *head2)
{int len1 = GetLinkLen((Node *)head1);int len2 = GetLinkLen((Node *)head2);Node *temp1 = (Node *)head1;Node *temp2 = (Node *)head2;if (len1 == len2){while (temp1 && temp1->data == temp2->data){temp1 = temp1->next;temp2 = temp2->next;}return temp1 ? temp1->data - temp2->data : 0;}else {return len1 - len2;}
}void PrintLink(Node *head)
{printf("%#X: ", (unsigned int)head);while(head){printf("%d%s", head->data, head->next ? "-->" : "\n");head = head->next;}
}void FreeLink(Node *head)
{Node *temp;while(head){temp = head->next;free(head);head = NULL;head = temp;}
}#define ARR_LEN 3
Node *g_pNodeArr[ARR_LEN];void Initdata()
{int arr1[] = {2, 3, 4, 6};int arr2[] = {6, 2, 4, 5};int arr3[] = {5, 3, 1};g_pNodeArr[0] = CreateLink(arr1, 4);g_pNodeArr[1] = CreateLink(arr2, 4);g_pNodeArr[2] = CreateLink(arr3, 3);
}int main()
{Initdata();printf("---------------BEFORE QSORT-------------\n");for (int i = 0; i < ARR_LEN; ++i){PrintLink(g_pNodeArr[i]);}qsort(g_pNodeArr, sizeof(g_pNodeArr), sizeof(Node *), cmp);printf("---------------AFTER QSORT-------------\n");for (int i = 0; i < ARR_LEN; ++i){PrintLink(g_pNodeArr[i]);}for (int i = 0; i < ARR_LEN; ++i){FreeLink(g_pNodeArr[i]);	}getchar();return 0;
}
  • 排序函数有问题

这篇关于Qsort对链表指针排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046304

相关文章

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c