20210420

闲聊 | 回顾 | 田静语法C4-S2 | 高数第二轮复习-第一章(一)| 数据结构-串(一)| 恋词U9

Table of Contents

闲聊

昨晚十点就回到寝室了,看了张子枫的《我的姐姐》。上一次这么爆哭我都忘了是什么时候了,如果不是在宿舍我可能哭的更厉害,其实从一开始就能猜到结局,但是故事情节的发展到某一个点我的心理防线就破了,现在最记得的就是弟弟问姐姐“我只有你了”这句话吧,从这里往后我眼泪就献给了这部电影了。

我是一个有两个姐姐的弟弟,不能说和这部电影中的弟弟感同身受,但姐姐与弟弟的这种姐弟情我自认还是蛮了解的,虽然小时候总是吵架甚至吵架,但是现在长大之后就真的觉得如果姐姐要嫁人了我也肯定舍不得。

不说了,学习了。张子枫的演技真是一步步在提高,弟弟也很不错!

回顾

恋词复习

数据结构单链表归并回顾

昨天CJ给我看了一下一个数据结构的代码,大概就是单链表的归并操作,问题是为什么A结点用完之后没有free掉,不会很浪费吗?当时没有仔细看,后来发现这份代码就是链表的归并操作的通用代码。至于为什么没有free掉,看下面。

题目如下:A和B是两个单链表(带表头结点),其中元素递增有序。设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由A和B中的结点组成。

首先先解释一下什么是非递减有序。就是从小到大或者允许中间有相等的情形,比如1 3 4 5 5 6就是非递减有序排列

12345; //递增排列,
98765; //递减排列。
12334588; //非递减排列,
987765521; //非递增排列。

所以题目的意思就是正常链表归并的意思:归并两个链表,这两个链表本来是递增有序的,希望归并成新链表之后还是递增有序的(这里严格来说是非递减有序)。那么算法思想非常简单,定义两个指针(p,q)分别追踪AB,然后一直比较,谁小谁所指结点就并入新的链表之中,然后这个指针往后移一位进行新的比较,如此往复。即如图:

那么重点就来了,新的链表是CAB都是带头结点的单链表,显然也要归并成一个含有头结点的单链表,那么需不需要为这个链表申请一个头结点空间呢?肯定不需要呀,待归并的两个链表都有头结点了,不用白不用啊!随便拿一个来用即可,就有C = A这一句了(让C指向A链表的头结点),那么B的头结点没有用了呀,就free掉。

A为什么还是没有free掉,看下图吧。

image.png

所以如果free(A)会怎么样?全都没了。因为C也只是指向了A,A指向的没有变过!


田静语法C4-S2-定语从句

定语从句的概述

一个句子作定语,修饰限定名词,放在所修饰名词后。

定语从句的写法

关系词+陈述句(重点是关系词的选择)。

image.png

定语从句的分类

限定性定语从句和非限定性定语从句。

定语从句的补充


高数第二轮复习-第一章(一)

我打算采用先用思维导图列出某一章的知识点,再根据题目去巩固知识点,记得做好错题集!

思维导图

下面这张思维导图只是网上找的,自己有根据这张思维导图进行修改。

题目

暂时不在这里展示,看笔记吧!今天只搞了660前15题。


数据结构-串(一)

定义(逻辑结构)

串是由零个或者多个字符组成的有限序列。串中字符的个数称为串的长度,含有零个元素的串叫空串。

image.png

存储结构

串的存储结构有很多种,这里只讲比较适合用于考研解题的串的存储结构。


  1. 定长存储结构
typedef struct
{
char str[maxSize+1];
int length;
}Str;
  1. 变长存储结构
typedef struct
{
char *ch;
int length;
}Str;
//实例化
Str S;
S.length = L;
S.ch = (char*)malloc((L+1)*sizeof(char));
S.ch[length范围内的位置] = 某字符变量;
某字符变量 = S.ch[length范围内的位置];
free(S.ch);

定长与变长存储结构比较

顺序存储结构类型 优点 缺点
定长存储结构 操作简单,分配释放空间系统来做 如果遇到很长的串,当前分配的存储空间不够,要重新设计结构体
变长存储结构 ~只需要free掉之前的,重新分配一个更大的即可 操作相对复杂

赋值操作

int strAssign (str& str, char* ch)
{
if(str.ch)
free(str.ch);
int len=0;
char *c=ch;
while (*c)
{
++len;
++c;
}
if (len==0)
{
str.ch=NULL;
str.length=0;
return 1;
}
else
{
str.ch=(char*)malloc(sizeof(char) * (len+1));
if(str.ch==NULL)
return 0;
else
{
c=ch;
for (int i=0;i<=len;++i,++c)
str.ch[i]=*c;
str.length=len;
return 1;
}
}
}

取串长度

int strLength (Str str)
{
return str.length;
}

串比较

设两串C1和C2中的待比较字符分别为a和b;
如果a的ASCll码小于b的ASCI码,则返回C1小于C2标记(一个负数);
如果a的ASClII码大于b的ASCII码,则返回C1大于C2标记(一个正数);
如果a的ASCII码等于b的ASCII码,则按照之前的规则继续比较两串中下一对字符;
经过上述步骤没有比较出C,和C2大小的情况下,先结束的串为较小串,两串同时结束则返回两串相等标记(O)。

int strCompare (Str s1, Str s2 )
{
for(int i=0 ;i<sl.length && i<s2.length; ++i)
if(sl.ch[i] != s2.ch [i])
return s1.ch[i] - s2.ch [i];
return s1.length - s2.length;
}

串连接

int concat (Str& str,Str str1,Str str2)
{
if(str.ch)
{
free (str.ch);
str.ch=NULL;
}
str.ch=(char* ) malloc(sizeof(char) * (str1.length+str2.length+1));
if (!str.ch)
return 0;
int i=0;
while (i<str1.length)
{
str.ch[i]=str1.ch [i];
++i;
}
int j=0;
while(j<=str2.length)
{
str.ch[i+j]=str2.ch[j];
++j;
}
str.length=str1.length+str2.length;
return 1;
}

求子串

int subString (Str& substr,Str str, int pos, int len)
{
if(pos<0 || pos>=str.length || len<0 || len>str.length-pos)
return 0;
if(substr.ch)
{
free (substr.ch);
substr.ch=NULL;
}
if(len == 0)
{
substr.ch=NULL;
substr.length=0;
return 1;
}
else
{
substr.ch= (char*)malloc(sizeof (char) * (len+1));
int i=pos;
int j=0;
while (i<pos+len)
{
substr.ch[j]=str.ch[i];
++i;
++j;
}
substr.ch[j] = '\0';
substr.length = len;
return 1;
}
}

清除串

int cleanString(Str &str)
{
if(substr.ch)
{
free (str.ch);
str.ch=NULL;
}
str.length = 0;
return 1;
}

恋词U9