单项链表排序

单向链表的排序(使用冒泡排序交换节点) 文章内容: 第一点:首先我们谈一谈有关链表的储存问题,首先我希望大家记住一各准则:链表的头指针尽量不要用来存储数据,为什么?因为这样会使你处理数据时更加的方便,方便在哪里?如果头指针不放数据的话,那么你在处理数据的时候,就可以将所有数据都统一对待?有的同学可能会有疑惑,结合排序说一下吧?排序的话其实就是改变各链节中的指针的指向,因为你链表的本质就是通过指针将多个链节(结构体)连接在一起,而排序就是改变链节的先后顺序,而改变它的顺序就是要改变其前后连接的的指针的指向。好讲到这里我问再回到我们最开始的问题:为什 阅读详情

今天复习单项链表。自己编了一上午,蛋疼。。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define M 2
struct student
{
    char name[M];
    double score;
    struct student *next;
};
struct student *creat(int n)
{
    struct student *phead, *pnew, *ptail;
    pnew = (struct student *)malloc(sizeof(struct student));
    phead = pnew;
    ptail = pnew;
    for (int i = 1; i < n; ++i)
    {
        pnew = (struct student *)malloc(sizeof(struct student));
        ptail->next = pnew;
        ptail = pnew;
    }
    ptail->next = NULL;
    return phead;
}
void pri(struct student *head)
{
    struct student *p;
    p = head;
    while(p != NULL)
    {
        printf("%s %f\n", p->name, p->score);
        p = p->next;
    }
}
struct student *insert(struct student *head)
{
    struct student *p, *pold, *pnew = (struct student *)malloc(sizeof(struct student));
    scanf("%s %lf", pnew->name, &pnew->score);
    p = head;
    if (pnew->score > head->score)
    {
        pnew ->next = head;
        head = pnew;
    }
    else
    {
        while(p != NULL && pnew->score < p->score)
        {
            pold = p;
            p = p->next;
        }
        pnew->next = p;
        pold->next = pnew;
    }
    return head;
}
int main(int argc, char const *argv[])
{
    struct student *head;
    int n = 0;
    scanf("%d", &n);
    head = (struct student *)malloc(sizeof(struct student));
    scanf("%s %lf", head->name, &head->score);
    head->next = NULL;
    for (int i = 1; i < n; ++i)
    {
        head = insert(head);
    }
    pri(head);
    return 0;
}

还有好些错的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define M 2
struct student
{
    // char name[M];
    double score;
    struct student *next;
};
struct student *creat(int n)
{
    struct student *head, *tail, *pnew;
    pnew = (struct student *)malloc(sizeof(struct student));
    scanf("%d", &pnew->score);
    head = pnew;
    tail = pnew;
    for (int i = 1; i < n; ++i)
    {
        pnew = (struct student *)malloc(sizeof(struct student));
        scanf("%d", &pnew->score);
        tail->next = pnew;
        tail = pnew;
    }
    tail->next = NULL;
    printf("Created\n");
    return head;
}

struct student *sort(struct student *head)
{
    struct student *p, *q, *small;
    double temp;
    for (p = head; p->next != NULL; p = p->next)
    {
        small = p;
        for (q = p->next; q; q = q->next)
        {
            if (q->score < small->score)
            {
                small = q;
            }
            if (small != p)
            {
                temp = p->score;
                p->score = small->score;
                small->score = temp;
            }
        }
    }
    return head;
}
int main(int argc, char const *argv[])
{
    int n = 0;
    scanf("%d", &n);
    struct student *head, *p, *q;
    head = creat(n);
    q = sort(head);
    for (p = q; p != NULL; p = p->next)
    {
        printf("%d\n", p->score);
    }
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define M 2
struct student
{
    char name[M];
    double score;
    struct student *next;
};
struct student *creat(int n)
{
    struct student *head, *tail, *pnew;
    pnew = (struct student *)malloc(sizeof(struct student));
    scanf("%s %d", &pnew->name, &pnew->score);
    head = pnew;
    tail = pnew;
    for (int i = 1; i < n; ++i)
    {
        pnew = (struct student *)malloc(sizeof(struct student));
        scanf("%s %d", &pnew->name, &pnew->score);
        tail->next = pnew;
        tail = pnew;
    }
    tail->next = NULL;
    printf("Created\n");
    return head;
}
// void swap(struct student *a, struct student *b)
// {
//  struct student c;
//  c = *a;
//  // a->name = b->name;
//  a->score = b->score;
//  *b->name = *c.name;

//  // b->score = 
//  // c = *a;
//  // *a = *b;
//  // *b = c;  
//  // printf("did swap\n");
//  // c->next = a->next;
//  // a-next = b->next;
// }
struct student *sort(struct student *head)
{
    printf("Began sort!\n");
    struct student *p,*q;
    // int k = 0;
    p = head;
    int i = 0;
    for (;p->next != NULL; p = p->next)
    {
        printf("first for\n");
        // for (q = p->next; q != NULL; q = q->next, i++)
        // {
        //  if (p->score < q->score)
        //  {
        //      // swap(p, q);
        //  }
        //  printf("i did it\n");
        // }
        // for (q = p->next; q != NULL; q = NULL)
        // {
        //  printf("second for\n");
        //  printf("q is %s\n", q->name);
        //  if (q->next == NULL)
        //  {
        //      printf("q's next == NULL\n");
        //  }
        //  printf("q->next = %s\n", q->next->name);
        //  // // if (q->next->next == NULL)
        //  // {
        //  //  printf("q-next-next = NULL\n");
        //  // }
        //  // printf("%s\n", q->next->name);
        //  // if (p->score < q->score)
        //  // {
        //  //  swap(p, q);
        //  // }
        // }
        // q = p->next;
        // while(q != NULL)
        // {
        //  if (p->score < q->score)
        //  {
        //      swap(p, q);
        //  }
        //  printf("before q = %s\n", q->next);
        //  q = q->next;
        //  printf("after q = %s\n", q->name);

    }
    // while(p->next != NULL)
    // {
    //  p = p->next;

    // }
    printf("Sorted\n");
}
int main(int argc, char const *argv[])
{
    int n = 0;
    scanf("%d", &n);
    struct student *head, *p;
    head = creat(n);
    // head = head->next;
    // for (int i = 1; head != NULL; head = head->next, i++)
    // {
    //  printf("%d'th yuansu\n", i);
    //  printf("%s\n", head);
    // }
    // if (head->next->next == NULL)
    // {
    //  printf("OK\n");
    // }
    // printf("%s\n", head);
    // printf("fist person is %s\n", head->name);
    head = sort(head);
    // if (head->next->next == NULL)
    // {
    //  printf("OK\n");
    // }
    // for (p = head; p != NULL; p = p->next)
    // {
    //  printf("%s %d\n", p->name, p->score);
    // }
    return 0;
}
42.单向链表从小到大排序 给定的程序中,函数fun的功能是将不带头结点的单项链表结点数据域中的数据从小到大的排序。 #include #include #define N 6 typedef struct node { int data; struct node *next; }NODE; void fun(NODE *h) { NODE *p, *q; int t; p = h; whi 阅读详情

相关推荐

如何用Lmcache+vllm优化KVcache存储?CPU与SSD性能实测对比

本文通过实测对比,详细介绍了如何利用Lmcache+vLLM将大模型推理中的KV Cache卸载至CPU内存或SSD硬盘,以解决长上下文场景下的GPU显存瓶颈。测试数据显示,CPU卸载方案在首字延迟(TTFT)上显著优于SSD方案,但SSD方案在存储成本上更具优势。文章提供了完整的配置指南、性能数据分析和生产环境选型建议。

fire9的博客 988

单向链表中的数据排序问题

文章目录前言一、单向链表中数据排序问题的解决方案二、方法优劣比较1.运用GetTickCount()函数来记录两种方法在同一长度链表排序中的时间2.记录结果和比较总结 前言 在利用单链表做学生信息管理系统的时候发现了一个一直忽略一个问题,就是在单链表中如何进行排序的问题,我们知道在顺序表中可以很轻易的利用冒泡排序或者归并排序等各种算法轻易实现排序,但在单链表中该如何进行排序引起了我的思考。在一番思索过后,我暂时给出了两种基本的解决方案,这两种方案我都放在了之前的一篇文章中,详细代码可以参考数据结构——(.

zswsx123的博客 2130

如何在R中高效安装ropls及其依赖包

本文详细介绍了在R语言中高效安装ropls包及其依赖的完整流程。作为Bioconductor生物信息学分析包,ropls的安装需通过BiocManager管理器进行。文章提供了标准安装步骤、跨系统避坑指南及安装后验证方法,帮助用户解决R版本、编译环境和网络镜像等常见问题,确保代谢组学数据分析工具顺利部署。

efc123456的博客 908

单向链表的三种排序算法---快速排序,归并排序,插入排序

给链表排序是面试中常考的一道题,今天总结一些经常链表排序的三种常用算法。分别是:快速排序、归并排序和插入排序。 快速排序 数组的快速排序相必大家都烂熟于心了,很简单,就是选定一个pivot,然后将大于等于pivot的排在pivot的右边,下雨pivot的排在pivot的左边。这样pivot的最终顺序就确定好了,接下来只需要对pivot的左边和右边执行相同的过程即可。 代码如下:...

qq_22158743的博客 2063

使用mixamo导入人物动作到unity

导入的材质是withoutSkin时选择Create From Other Model + 选择带withSkin里的。方案二:Textures选择Extract Textures,将文件存放到喜欢的位置(不行继续方案三)2.动画没有动:开个Animation窗口,选择人物的Prefab(Hierachy),查看窗口左侧。方案三:选中素材自带或者导出的Material,接着方案一选择 选中的materials进行转化。选 withSkin,剩下的动作选without Skin)(角色发生位移时出现选项)

big_good_boy的博客 1636

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1171

单向链表排序

一、冒泡排序简述 1、概念 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。   它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。 2、实例分析 以数组为例进行说明:   数组a[4] = {4,...

qq_43449554的博客 1559

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7488

单向链表排序:快速排序和归并排序

归并排序改变链接 快速排序改变链接 快速排序改变节点值 所有源码和测试函数 对单向链表的排序有2种形式,只改变节点的值 和 只改变链接// 节点 struct ListNode { int val; ListNode* next; ListNode(int v, ListNode* n = NULL) { val = v; next = n;

quinn的专栏 6211

从NHANES到发表:如何用survey包完成符合CDC要求的统计分析(含完整R代码)

本文详细介绍了如何利用R语言的survey包,对美国国家健康与营养调查数据进行符合CDC要求的统计分析。文章重点解析了NHANES数据的复杂抽样设计、权重变量的正确选择与调整,并提供了从数据获取、清洗、构建调查设计对象到执行加权回归及生成发表级表格的完整R代码实战指南,帮助研究者避免常见错误,确保分析结果的准确性与可发表性。

weixin_29054245的博客 521

5.2.4_标志位的生成

计算机组成原理之标志位的生成

人生得意须尽欢 7603

带头结点的非循环单项链表的排序

if (r->next->data > q->data) 第3个结点的数据小于第4个结点的数据,执行r = r->next 语句,然后继续进行循环,最后经过第3个结点,第2个结点,最后到第1个结点,然后判断 r->next 的时候为NULL,则不在进入第二个while循环,直接执行后面的两条语句。p = head->next->next 这条语句表示p指针指向第2个结点,head->next->next = NULL 然后把第二个结点的指针域置为NULL,q、r指针暂时还没有指向。

qq_67574411的博客 306

【Python】-- 趣味代码 - 发牌游戏

Python -- 趣味代码 - 发牌游戏

银尘博客 352

单项链表及双向链表的简单操作

单项链表的 建立、插入(有序,构造有序链表),删除节点,头插法,尾插法,排序(交换数据)及输出函数,释放节点; #include<stdio.h> #include<stdlib.h> struct node{ int data; struct node *next; }; struct node *head=NULL,*t,*q,*p; void built()//...

Bearing in mind forever! 269

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

单项链表 练习3.5 给定两个已排序的表求并集

3.5 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程 void Insert( ElementType x, List L, Position P ) { Position tmpCell; tmpCell = ( Position )malloc( sizeof( struct Node )); tmpCell->x = x; tmpCell->ne

yysdyyyy的博客 1399

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[c++]合并排序多个已排好序的单项链表

题目来源:Leetcode 题目描述: Mergeksorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [ 1->4->5, 1->3->4, 2->6 ] Output:...

weixin_33853827的博客 168

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

单项链表 练习3.4 给定两个已排序的表求交集

3.4 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程 List Intersection( List L1, List L2 ) { List L; Position p1, p2; L = ( Position )malloc( sizeof( struct Node )); L->next = NULL; p1 = L1->next; p2 =

yysdyyyy的博客 1255

单项列表冒泡法排序

单向链表冒泡法排序

qq_73842319的博客 167

剔除单向链表重复值节点时的烦人bug

一、初步实现:以前在写单项链表重复值删除的时候,用的是先排序然后进行重复值剔除的方法。重复值剔除完毕之后,得到的元素也是有序的,然后顺利的写完了,没有出现任何bug。也就没有去尝试新的方法去做,代码如下:# include<stdio.h> # include<stdlib.h> # include<time.h>typedef struct Node{ int data; stru

Apollon_krj的博客 565

单向链表基本操作1

/*************************************************************************************************** 单项链表基本操作 环境:VS2005   WIN控制台程序 楼主:张永辉   20120907 ***********************************************

zyhui65的专栏 491

一个链表问题

问题: 建立一个10结点的单项链表,每个结点包括:学号、姓名、性别、年龄。对其进行排序,采用插入排序法,按学号从小到大排列。 1 //思路1,本问题可以仅仅通过类似于对待一般数组一样,通过不断插入赋值来达到目的;author欲通过仅仅对指针进行操作来完成,避免赋值、提高效率; 2 #include<iostream.h> 3 4 struct p...

weixin_30409849的博客 107

顺序表与链表周总结

然后是队列安排,这个和我所论述的第一道题目差不多,只是有一个0,1,操作,让我们选择前插还是后插,这里我们要定义两个结构体变量来实现这一操作,因为一个结构体变量不能实现前插,这里这道题目论述前插和后插的函数putnums。首先这个题目就是一个一个不重复的数字组成的链表,我先设了一个头结点不储存任何数据,然后这个表一开始不是空链表,而是包含一个元素1的链表,那么我首先操作,建立这样一个链表,代码如下:(这里假设头文件都有,写在主函数中)p->next=p->next->next;u<n-1;

water_fires的博客 470

双向链表的学习

双向链表

weixin_51599093的博客 400

[LeetCode] Sort List 排序 sort

Sort a linked list inO(nlogn) time using constant space complexity. Hide Tags Linked ListSort   基于单项链表的排序,时间为nlogn ,O(1)空间,其实及将数组的快速排序用链表实现,并用递归来维护拆分与合并。 #include ...

weixin_33701617的博客 82
上一篇: 结构体对齐问题
下一篇: 单链表的递归逆置
sevanco
博客等级 码龄12年 4粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值