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

相关文章

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

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

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in