首页 > 其他分享 >【趣学C语言和数据结构100例】

【趣学C语言和数据结构100例】

时间:2024-10-19 22:47:10浏览次数:7  
标签:结点 遍历 趣学 next 链表 while 单链 100 C语言

【趣学C语言和数据结构100例】

问题描述

  1. 在带头结点的单链表中,删除所有值为 x 的结点,并释放其空间,假设值为 x 的结点不唯一,试编写算法以实现上述操作。

  2. 试编写在带头结点的单链表中寻找一个最小值结点的高效算法(假设该结点唯一)

  3. 设在一个带表头结点的单链表中,所有结点的元素值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素(若存在)。

  4. 给定两个单链表,试分析找出两个链表的公共结点。(暴力破解,最优解)

  5. 设 C={a1, b1, a2, b2, …, an, bn} 为线性表,采用带头结点的单链表存放,设计一个就地算法将其拆分为两个线性表,使得 A={a1, a2, …, an}, B={b1, b2, …, bn}。

代码分析

41.带头结点的单链表删指定值

//如果带头结点,则已经定义好L的头结点,可以直接使用L,L->next
Lnode *pre=L,*p=L->next

//如果不带头结点,则需要先定义L的结点
L=(Node *) malloc(sizeof (LNode));
L->next=NULL;

分析:无返回值+对链表操作+传入删除值,故函数命名为void 函数命(LiukList &L,int x),使用while循环,条件为p !=NULL(不到最后一直遍历),如果p的值为指定的x,则使pre的next和当前的p的next连接,即跳过p,并且释放p,使用free§,使p=pre->next;继续,如果p的值不为指定的x,则pre和p都向后移动一位,使用p=p->next

//如果遍历,则while循环,条件为p != NULL
while(p){
   }

42.带头结点的单链表找一个最小值结点
分析:设置工作指针和存储的最小指针。工作指针:通常为Lnode *pre=L,*p=L->next,使用while§循环遍历,如果当前的工作指针的值<最小指针的值,则继续替换存储,然后继续都向后移动一位。到结束输出最小的值。

43.带表头结点的单链表删除指定范围的值
分析:可以参考41,只需要把p的值为指定的x改为范围,其余一样。

44.两个单链表找公共结点(暴力破解,最优解)

有两个链表:abcde和fgde,如下图
a->b->c
        ↘
	      d->e
        ↗
   f->g

解法1(暴力破解):
分析返回值为Lnode *类型,则函数名为Lnode * 函数名(LiiukList L1,LiiukList L2),分析进入函数后需要访问两个链表的工作指针p和q,初始化为Lnode * p=L1->next;使用while(p)循环遍历,使用while(q)循环继续内部遍历,如果p==q则返回p为公共结点,否则使q->向后移动,内部遍历后,没有找到结果,则外部循环移动,并且内部遍历从头遍历。到最后如果没有找到,则返回为NULL

解法2(最优解):

//链表的长度
int length=0;
while(p){
   
	lenth++;
	p=p->next;
}

分析:计算两个的长度,从他们的相差的位置开始。注意:计算链表的长度后使p和q指向L->next。使长度大的先移动差位。然后使用while遍历访问,此时可以同时移动到他们相等时,即可找到公共结点。到最后如果没有找到,则返回为NULL

解法1(暴力破解)的时间复杂度为O(m*n) //平方级
解法2(最优解)的时间复杂度为O(m+n+min(m,n)) //常量级

45.链表的拆分

    // 创建链表
    LiukList L = 

标签:结点,遍历,趣学,next,链表,while,单链,100,C语言
From: https://blog.csdn.net/lwcwam/article/details/143082096

相关文章

  • 哈哈哈!力扣80题击败100%
    实在没想到能击败100%,忍不住嘚瑟一下:这道题是leetcode第26题的姐妹篇,也是删除有序数组中的重复元素,但是重复元素需要保留两个。增加的这个小小要求可是不容易搞。按照第26题的思路,不外乎双指针,设置一个起始指针(简称后指针)作为参照元素的索引号,以另外一个指针(简称前指针)控制......
  • 数据结构C语言|队列相关
    队列普通队列与循环队列:结构体初始化队列判断队空入队出队检查队满循环队列链式队列:链式队列链式队列结构初始化判断是否为空入队出队遍历全部代码展示结构体typedefintElemType;#defineMaxSize10typedefstruct{ ElemTypedata[MaxSize]; //用静态......
  • C语言解决约瑟夫环(PTA链表)
    题意:就是N个人围成一个圈(想到循环),开始报数,报到一个指定的数p,则这个人出局,后延,比如本题的样例,第三个人报了3,则第四个人继续从1开始报数,一直循环下去,第七个人报完之后,再到第一个人,直到只剩下一个人,那么下一个出局的只剩下这个人。解题思路:我们看到,最后一个人报数之后,又回到了......
  • C语言 【操作符(上)】
        最开始提到C语言操作符,我还是有一些不屑的,这玩意有啥学的呀?今天静下心来阅读学习了一下操作符部分的知识,这部分还真得认真学习学习!下面我将操作符中一些比较关键的点进行罗列和详细说明。一来帮助我加深理解,二来希望能帮助到有缘点击进来的读者。1、算术操作符:+ ......
  • C语言经典游戏代码大全(珍藏版)
    前言发现很多朋友都想要一些小项目来练手,却找不到从哪里寻找,给大家整理了游戏项目开发源代码汇总。一、最经典游戏之俄罗斯方块#include<iostream>#include<math.h>#include<Windows.h>#include<conio.h>#include<ctime>usingnamespacestd; enumDIR{   UP......
  • Leecode热题100-101.对称二叉树
    给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false提示:树中节点数目在范围 [1,1000] 内-100<=Node.val<=100进阶:你可以运用递归和迭代两种方法解决这个问......
  • Linux C语言TCP协议实战
    文章目录1.TCP简介2.搭建框图3.相关函数介绍3.1socket函数3.2bind函数3.3listen函数3.4accept函数3.5connect函数3.6send函数3.7recv函数3.8其他函数4.实战4.1一对一模型4.1.1server.c4.1.2client.c4.1.3终端结果4.2多进程模型4.2.1server.c4.2.2cl......
  • 汉诺塔问题和青蛙跳台阶问题(c语言)
     这俩道题都是利用到了函数递归的思想,其中汉诺塔问题较难理解,青蛙跳台阶则较简单汉诺塔问题题述:设有三根柱子分别时A,B,C,在A柱子上放着n个盘子,每个盘子大小不一样,从下往上盘子大小依次减小,要求将A柱子上的盘子移动到C柱,且不改变盘子顺序(由大往小排序)。规则:1.一次只能......
  • LeetCode热题100|买卖股票的最佳时机(贪心)
    简述题意省流版:在一个序列里找到max(a[i]-a[k])且i>k。解题思路:  遍历这个序列,i表示当前遍历到了第i个元素,min1表示1到i这个范围内最小的元素,max1表示1到i这个范围内最大的【max(a[i]-a[k])】。max1=max(max1,第i个元素的值-min1)代码如下:classSolution{public:intm......
  • 【C语言】动态内存管理(上)
    本篇博客将讲解以下知识点:(1)为什么要有动态内存分配(2)malloc和free1、为什么要有动态内存分配我们已经掌握的内存开辟方式有:intval=40;//向内存中申请4个字节空间存储valchararr[10];//向内存申请10个字节空间 上述的开辟空间的方式有两个特点:(1)空间的开辟......