问题引入:

某校实验室有一批计算机,按其价格从低到高的次序构成了一个单链表存放,链表中每个结点指出同样价格的若干台。现在又增加m台价格为h元的计算机,编程实现实验室计算机单链表中增加计算机的算法。

分析

这和插入排序的思想有点类似,我们直接在每次插入的时候都按照主关键字(即价格price)的顺序插,这样每次插入后都是有序的。

算法实现:

typedef struct node {double price;//价格int count;//数量struct node *next;
}*SLNode;
//插入函数
void Insert(SLNode head, double price, int count)
{SLNode p, q,r;p = head->next;q = head;while (p != NULL) {if (p->price == price) {//已存在就增加数量p->count += count;return;}else if (p->price > price) {//找到合适的插入位置r = (SLNode)malloc(sizeof(struct node));r->price = price;r->count = count;r->next=q->next;q->next = r;return;}else if(p->price<price){q=p;//q始终指向p的前驱p = p->next;}}//走到这里说明,表中没有比要插入的price还要大的结点//直接接在链表表尾就行r = (SLNode)malloc(sizeof(struct node));r->count = count;r->price = price;r->next = NULL;q->next = r;return;
}

完整代码(VS2017)

LNode.h

#pragma once
typedef struct node {double price;//价格int count;//数量struct node *next;
}*SLNode;
//初始化
void Initiate(SLNode *head) {*head = (SLNode)malloc(sizeof(struct node));//申请头结点(*head)->next = NULL;
}
//插入函数
void Insert(SLNode head, double price, int count)
{SLNode p, q,r;p = head->next;q = head;while (p != NULL) {if (p->price == price) {//已存在就增加数量p->count += count;return;}else if (p->price > price) {//找到合适的插入位置r = (SLNode)malloc(sizeof(struct node));r->price = price;r->count = count;r->next=q->next;q->next = r;return;}else if(p->price<price){q=p;//q始终指向p的前驱p = p->next;}}//走到这里说明,表中没有比要插入的price还要大的结点//直接接在链表表尾就行r = (SLNode)malloc(sizeof(struct node));r->count = count;r->price = price;r->next = NULL;q->next = r;return;
}
//打印链表所有结点的数据元素
void print(SLNode head)
{SLNode p = head->next;printf("价格\t\t数量\n");while (p != NULL){printf("%lf\t%d\n", p->price, p->count);p = p->next;}
}
//撤销单链表的申请空间
void Destroy(SLNode head)
{SLNode q;SLNode p = head->next;while (p) {q = p;p = p->next;free(q);}head = NULL;
}

test.cpp

#include<stdio.h>
#include<windows.h>
#include"LNode.h"
#include<malloc.h>
#include<stdlib.h>
int main() {SLNode head;Initiate(&head);for (int i = 0; i < 10; i++){Insert(head,i+1,i+2);}print(head);Insert(head, 10, 10);print(head);system("pause");return 0;
}

运行结果:

第一次插入10个结点,第二次还是插入价格为10的结点,但由于链表已经有price=10的结点了,直接给那个结点的数量增加count就行(题目要求)。注意圈起来两处的数量

PS:

我竟然改bug改了好久,最后才发现自己竟然卡在了一个逻辑问题上,唉,最近这状态下滑,插入排序都能卡住,醉了,但是改好之后是真的舒服。

插入有序的单链表(要求插入后元素有序排列)相关推荐

  1. 数据结构例16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序。

    /* 16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序. */ # include <iostream> # include <stdlib.h> # i ...

  2. 【 C 】在单链表中插入一个新节点的尝试(二)

    在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...

  3. 【 C 】在单链表中插入一个新节点的尝试(一)

    根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...

  4. 两个无序单链表,排序后合并成一个有序链表

    两个无序单链表,排序后合并成一个有序链表 算法思想:用冒泡法,对链表1和2进行排序,对排序后的两个链表,从小到大进行循环,装入链表3中. #include<stdio.h> #includ ...

  5. 单链表的插入和删除_从0开始的编程之梦——数据结构之单链表的基本运算

    一.求带有头结点的单链表长度 算法思路:沿带头节点单链表L的首元结点计数统计单链表长度 算法描述: 顺链头开始,计数器j初值为0:当前指针p指向链表L的首元结点 p=L->next p依次往后( ...

  6. 建立单链表 单链表的插入_单链列表插入

    建立单链表 单链表的插入 All possible cases: 所有可能的情况: Inserting at beginning 开始插入 Inserting at the ending 在末尾插入 ...

  7. 单链表的插入和遍历 包括头插入和尾插入

    // Win32Project1.cpp : 定义控制台应用程序的入口点. // //单链表的插入和遍历 #include "stdafx.h" #include <AccC ...

  8. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  9. 两个有序链表合并成一个有序的单链表

    将这两个有序链表合并成一个有序的单链表 要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间 表中允许有重复数据 算法描述 (1)定义一个合并后的指针pc指向La表的头结点.由于要求不占 ...

最新文章

  1. poj1419(最大独立集)
  2. springmvc【问题1】跨域
  3. kibana6.2.2安装
  4. SharePoint入门识记-整体架构
  5. Navicat Premium 安装
  6. 容器化Go应用--基础镜像的未知时区问题
  7. 程序员的算法课(15)-分治法获取文件中出现频次最高100词
  8. mfc打开指定路径下指定类型文件_Windows 网络编程:文件操作
  9. vue脚手架项目中引入jquery
  10. 祝微软北京.net俱乐部徐磊生日快乐
  11. 迅雷X 10.0.2.60 去广告版绿色精简版
  12. 解决Adobe Flash Player已不再受支持的问题
  13. 鉴定网站是否允许IPV6访问方法(湖大IPV6下载流量免费)
  14. 【深度学习】史上最全综述 | 3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)...
  15. xp系统从u盘启动计算机,电脑高手教你如何用u盘启动装xp系统!
  16. JAVA高级视频_IO输入与输出_第一部分(System、Runtime、Date、Calendar、MathRandom、IO输入输出与概述、文件的续写、FileReader、复制文件、)...
  17. CorelDraw插件开发-文字功能-文本分列-创建文本-函数分析-Cdr插件开发教程(二)
  18. 弱电时间同步系统(卫星同步时钟)医院学校标准时钟系统建设的意义
  19. LVS+Keeplive 负载均衡
  20. Java基础学习经验分享

热门文章

  1. tp用phpqrcode制作二维码,可在浏览器下载二维码
  2. webpack的热重载/热更新HMR是如何实现的
  3. ununtu20.04系统中如何划词翻译_真正的桌面端全能翻译软件,随时随地划词翻译...
  4. w7计算机防火墙无法更改,W7电脑系统提示Windows防火墙无法更改某些设置怎么办...
  5. 【蓝桥杯单片机组模块】4、按键模块
  6. 多重网络无法上网C语言解决,win7系统连接网络变成多重网络无法上网的解决方法...
  7. 极米投影仪文件共享无法连接,排错过程及解决方法
  8. 三星Q850T全景声回音壁发布,带后环绕5.1.2回音壁
  9. js之旅(十五)js向上取整、向下取整、四舍五入等
  10. 网络安全之linux命令大全