C博客作业05--2019-指针
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
- 指针做循环变量做法
设定一个新的指针q指向要循环的指针p
char * q=p;
for(;*q&&*q!='\n';q++)
{
循环内容;
}
- 字符指针如何表示字符串
1:设定一个字符指针p指向一个字符数组的首地址如:
char str={"abcdefg"};
char *p=str;
2:在定义指针的时候将其初始化为字符串char *p={"abcdefg"};
- 动态内存分配
使用malloc函数和calloc函数申请动态内存,之后使用free函数释放掉申请得来的空间如:
char *p=NULL;
p=(char*)malloc(N * sizeof(char));
free(p);
- 指针数组及其应用
指针数组用于存放多个同一类型数据的地址,格式为:类型名 *数组名[数组长度]。如:
char *p[10];
char q[10]={"abcdefghji"}
for (i = 0; i < 10; i++)
{
p[i]=&q[i];
}
- 二级指针、行指针
指向指针的指针称为二级指针,格式为:类型名 **变量名
行指针为指向数组的指针如:
int a[10];
int *p;
p=a;
这时*(p+i)=a[i]
- 函数返回值为指针
若函数的返回值为一个地址,则在定义函数的时候要将函数定义为指针,且返回的指针所指代的地址不能是函数中局部变量中的地址,不然在函数结束时这些数据会被系统收回,使返回的地址错误。
1.2 本章学习体会
学习完本章后,对输入所需要的&符号有了更好的了解,使在输入的时候忘记&符号的情况不再出现,并且将数据和地址看成两种数据是指针的学习更加的简单,指针的加入并没有使编程更加复杂,反而在面对数组时显地更加的方便,将指针与数组名的形式相联系也更方便学习。
本周的代码量:500行左右。
2.PTA实验作业
2.1合并两个有序数组
2.1.1 伪代码
定义void类型的merge函数(形参为int型指针a,int型m,int型指针b,int型n)
定义int型变量k作为循环变量
定义int型变量I作为数组a下标
定义int型变量J作为数组b下标
定义int型数组变量t[200000]作为排序后的数组
定义int型指针变量p指代数t
i,j,k初始化为0
for 循环条件为k<m+n do
if i==m
for 循环条件为k<m+n do
*(p+k)=b中的元素
b移向下一个元素
if b==n
for 循环条件为k<m+n do
*(p+k)=a中的元素
a移向下一个元素
if a中元素大于b中元素
*(p+k)=b中的元素
b移向下一个元素
else
*(p+k)=a中的元素
a移向下一个元素
for 循环条件为k<m+n do
将t中的元素赋值给a
t移向下一个元素
2.1.2 代码截图
2.1.3总结本题的知识点
- 掌握对数组的排序。
- 掌握两个指针的合并。
2.1.4PTA提交列表及说明
一开始是打算直接根据大小将数组b的元素直接插入数组a中,结果编程一直出错改不完全。
之后就直接再设一个数组根据大小来插入a,b数组中的元素,之后再将这个数组赋值给a完成替换。
在之后的错误是数组大小太小导致数据溢出,改大数组容量就正确了。
2.2 字符串的冒泡排序
2.2.1伪代码
定义int型变量i,j作为循环变量
定义int型变量N,K作为题目要输入的值
定义char型数组s[101][11]作为题目要输入的字符串
定义char型数组t[11]作为替换时的临时字符串
for i=0 循环条件为i<N do
输入字符串到s[101][11]
for i=0 循环条件为i<K do
for j=0 循环条件为j<N-i-1 do
if s[j]中字符串大于s[j+1]中的字符串
替换s[j]与s[j+1]的字符串
for i=0 循环条件为i<N do
输入s[i]中的字符串
2.2.2代码截图
2.2.3总结本题的知识点
- strcpy语句与strcmp语句的使用
- 冒泡排序的写法,如:
for (i = 0; i < N; i++)
{
for (j = 0; j < N - i-1; j++)
{
if (a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
2.2.4PTA提交列表及说明
多种错误:一开始输入写错了
答案错误:将从小到大排序写成了从大到小排序
2.3删除字符串中的子串
2.3.1伪代码
定义char型数组mom[101],s[101]作为题目输入的字符串与字串
定义char型指针*pta记录出现字串的首字符地址
输入字符串与字串
while *pta记录字串的首地址为不为空
将该地址的数据变为'\0'
将pta指代地址加上字串长度之后的数据连接到mom[101]字符串后面
输入字符数组mom[101]
2.3.2代码截图
2.3.3总结本题的知识点
- strstr与strcpy语句的使用,了解到当将一个字符串中间的某个值改为'\0'时,strcpy语句会从'\0'这个位置开始连接要连接的字符串
2.3.4PTA提交列表及说明
这道题是参考其他同学的代码
一开始我是使用题6-6查找字串的代码作为函数查找字串地址,之后根据字串长度将字符串的字符向前移动来覆盖与字符一样的错误,但个别答案错误不知道改法便参考了同学的代码,看来才想起strstr语句可以直接找到字串所对应的地址并可以通过strcpy语句进行连接。
但将该代码中的gets语句改为fgets语句时答案便错误了,不知道原因在哪里。
3.阅读代码
环形链表
题目描述:给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
代码截图:
代码解释:通过使用具有 不同速度 的快、慢两个指针遍历链表,慢指针每次移动一步,而快指针每次移动两步。
如果列表中不存在环,最终快指针将会最先到达尾部,此时我们可以返回 false。
如果列表真存在环,则这两个指针再不同速度运动下最终会有个瞬间使两个指针相等,则这时可以判断列表中有环。