数据结构代码集训day8(适合考研、自学、期末和专升本)

news/2024/11/13 5:32:04/

习题来自B站up:白话拆解数据结构!


题目如下:

(1)在递增有序的单链表L中,删除值重复的结点

(2)使带头节点单链表的值递增有序


题1

        和之前顺序表那题差不多,因为是有序的,所以值重复的必定挨着首先要有一个指针来遍历链表,还需要一个指针在该指针的前面,一是用来比较相邻值的大小,而是充当前驱指向删除操作。

Linklist del_same(Linklist &L){

    if (!L || !L->next) return L;        // 边界条件判断

    Lnode *p,*q;        // 提到的俩指针

    p=L->next;

    q=p->next;

    while(q){

        if(p->data==q->data){

            p->next=q->next;        //删除操作

            free(q);

            q=p->next;

        }

        else{

            p=p->next;

            q=q->next;

        }

    }

    return L;

}

实践:

完整代码如下:

#include <iostream>
#include <cstdio>
#include <ctime>using namespace std;// 单链表结构体定义
typedef struct Lnode{int data;Lnode *next;
}Lnode,*Linklist;Linklist list_insertbytail(Linklist &L){Lnode *s;int x;L = (Lnode*)malloc(sizeof(Lnode));L->next = NULL;Lnode *r = L;cin >> x;while(x!=9999){s = (Lnode*)malloc(sizeof(Lnode));s->data=x;s->next=NULL;r->next = s;r=r->next;cin >> x;}return L;
}// 在递增有序的单链表L中,删除值重复的结点
Linklist del_same(Linklist &L){if (!L || !L->next) return L;Lnode *p,*q;p=L->next;q=p->next;while(q){if(p->data==q->data){p->next=q->next;free(q);q=p->next;}else{p=p->next;q=q->next;}}return L;
}int main(){Linklist L;// list_insertbyhead(L);list_insertbytail(L);Lnode *p = L->next;printf("origin list:");while (p != NULL) {printf("%d ",p->data);p = p->next;}printf("\n");del_same(L);printf("new list:");Lnode *q = L->next;while (q != NULL) {printf("%d-> ",q->data);q = q->next;}printf("NULL");return 0;
}

题2

        这个题需要借助直接插入排序的思想,将链表的第一个结点next域置为空,将第一个元素视为有序区,断开的链表视为无序区,每次将无序区的一个链表结点插入到有序区中

        具体来说在有序区和无序区各需要两个指针有序区的两个指针:p用来遍历已排序部分,用于找到比 q->data 大或相等的节点,即插入位置;辅助指针s,指向 p 的前驱节点,用于在找到插入位置后,调整指针完成插入操作。无序区的两个指针:q为当前正在进行插入排序的节点(待插入的结点);t用来暂存 q 的下一个节点,保证在当前节点 q插入完后,能够继续遍历链表

Linklist sort_list(Linklist &L){

    if (!L || !L->next || !L->next->next) return L;

    Lnode *p,*q,*s;

    p=L->next;

    q=p->next;

    p->next=NULL;        // 分割有序区和无序区

    while(q){

        Lnode *t=q->next;

        s=L;

        p=L->next;

    while (p && p->data < q->data) {        // 寻找插入位置

            s = p;

            p = p->next;

        }

        q->next = p;

        s->next=q;

        q=t;

       

    }

    return L;

}

实践:

 

完整代码如下:

#include <iostream>
#include <cstdio>
#include <ctime>using namespace std;// 单链表结构体定义
typedef struct Lnode{int data;Lnode *next;
}Lnode,*Linklist;Linklist list_insertbytail(Linklist &L){Lnode *s;int x;L = (Lnode*)malloc(sizeof(Lnode));L->next = NULL;Lnode *r = L;cin >> x;while(x!=9999){s = (Lnode*)malloc(sizeof(Lnode));s->data=x;s->next=NULL;r->next = s;r=r->next;cin >> x;}return L;
}// 使带头节点单链表递增有序
Linklist sort_list(Linklist &L){if (!L || !L->next || !L->next->next) return L; Lnode *p,*q,*s;p=L->next;q=p->next;p->next=NULL;while(q){Lnode *t=q->next;s=L;p=L->next;while (p && p->data < q->data) {s = p;p = p->next;}q->next = p;s->next=q;q=t;}return L;
}int main(){Linklist L;// list_insertbyhead(L);list_insertbytail(L);Lnode *p = L->next;printf("origin list:");while (p != NULL) {printf("%d ",p->data);p = p->next;}printf("\n");sort_list(L);printf("new list:");Lnode *q = L->next;while (q != NULL) {printf("%d-> ",q->data);q = q->next;}printf("NULL");return 0;
}


http://www.ppmy.cn/news/1519489.html

相关文章

生成图片的base64编码(纯C语言实现)

一、前言 Base64编码是一种广泛使用的编码方案&#xff0c;将任意二进制数据转换为可打印的ASCII字符字符串。这种编码方式之所以重要&#xff0c;是因为许多通信协议和存储介质对数据的可传输性和可存储性有特定的要求&#xff0c;它们可能无法直接处理或有效传输二进制数据。…

vue路由Router设置父路由默认选中第一个子路由,切换子路由让父路由激活高亮效果不会消失

import Vue from vue; import VueRouter from vue-router;// 导入组件 import Home from ../views/Home.vue; import Parent from ../views/Parent.vue; import Child1 from ../views/Child1.vue; import Child2 from ../views/Child2.vue;Vue.use(VueRouter);// 定义路由 cons…

Mac怎么安装谷歌浏览器

谷歌浏览器凭借其强大的功能&#xff0c;成为广大用户的首选浏览器。其中Mac用户在进行下载和安装时&#xff0c;可能会出现一些困难。为了帮助大家顺利的在Mac系统中成功安装&#xff0c;下面就给大家详细分享Mac安装谷歌浏览器指南&#xff0c;希望对你有所帮助。 Mac安装谷歌…

备考AMC10美国数学竞赛2024:吃透1250道真题和知识点(持续)

有什么含金量比较高的初中生数学竞赛吗&#xff1f;美国数学竞赛AMC10是个不错的选择。那么&#xff0c;如何备考AMC10美国数学竞赛呢&#xff1f;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 今天是2024年9月2日&#xff0c;距离2024年AMC10…

数学基础 -- 线性代数之向量空间

向量空间与基变换 1. 向量空间的定义 向量空间&#xff08;Vector Space&#xff09;是指一组具有向量加法和数乘运算的元素的集合&#xff0c;并且这些运算满足以下公理&#xff1a; 加法封闭性&#xff1a;对于任意两个向量 u u u 和 v v v&#xff0c;它们的和 u v u…

Google Earth Engine(GEE)——土地覆盖分类的方法环境遥感之图像分类(2)

目录 简介 加载上次的分类 结果 改进分类 简介 本实验的目的是加深你对图像分类过程的理解。 加载上次的分类 我在下面提供了完整代码,但请记住,需要手动收集训练数据并分配土地覆盖属性。 //过滤时间窗口、空间位置和云层覆盖的图像集合 var image = ee.Image(ee.Image…

django企业开发实战-学习小结1

开发准备 编码规范 整体规范 控制台执行import this回显就是py社区推荐的整体规范 py编码规范 缩进 推荐使用四个空格做为缩进&#xff0c;py3不允许空格和tab混用&#xff0c;优先建议使用空格 import 一个import的规范&#xff0c;import分三部分&#xff0c;先后分别是…

RT-DETR+Sort 实现目标跟踪

在前一篇博客中&#xff0c;博主介绍了利用YOLOv8与Sort算法实现目标跟踪&#xff0c;在今天这篇博客中&#xff0c;博主将利用RT-DETR算法与Sort算法相结合&#xff0c;从而实现目标跟踪。。 这里博主依旧是采用ONNX格式的模型文件来执行推理过程&#xff0c;由于Sort算法是基…