CPrimerPlusV6这本书的学习经历总体来说还是比较令人愉悦的,但是行文啰嗦,夹杂着一些新手完全摸不着头脑的内容,我当时学到那些知识点是强忍着弃书的冲动强迫自己读下去的,如果让我重新再来一次的话,作为新手零基础是不应该将这本书作为初始教材的。
在学习中,我尽量在不看答案的情况下动手做课后习题和编程练习,有些比较难的题目甚至能花费我半天的时候去钻研,再有些特难的题目,我就先按照答案把代码打一遍有个初步了解,然后再自己打一遍,有时候头脑思维发散一些还能对习题要求进行再拓展,其他内容基本上还好,但是文本操作的内容有些忘记了我觉得过后还是需要再复习一下,毕竟操作文本储存数据也算计算机的实用性体现。有些C99的内容由于我的IDE是VS2010支持不了,所以也是跳过没学了。
CPrimerPlusV6目前学到第十七章-高级数据表示,据说这是数据结构的内容,数据结构的书《数据结构与算法分析-C语言描述》我只看了几眼觉得很难就先放一边了,现在在琢磨这个ADT抽象数据类型-17.3,我感觉通过这个习题我发现自己的指针基础还是很薄弱。
1.问题(unsolved):我本来计划将原本的List(指向Node结构类型的指针变量)更改成List(新建立的list结构类型的变量,list结构类型包含指向Node结构首项的指针、指向Node结构尾项的指针、Node结构计数),运行后链表只能保存输入的最后两项内容,琢磨了一下午都没搞懂,我只能改回与书本一致的方法,等以后指针内容学习扎实再说。
我现在又想在Node结构中添加一个记录当前项目数的标签,这个标签添加后可以读取存储的项数。
2.问题(solved):我在main函数中建立了一个指针变量指向(待保存数据的指针变量所指向的Node结构类型),通过while循环让新建立的指针变量查找链表的最后一项,然后读取该项所记录的项目数以显示总项目数。但是这几行我新添加的代码总是造成意外停止。
List pscan=man;
while(pscan->next)
pscan=pscan->next;
printf("Database contains %d students.\n",(pscan->index+1);
20211028解决了:更改为建立一个2级指针变量指向一个指向(待保存数据的指针变量所指向的Node结构类型)的指针的指针。
List *pscan=&man;
while((*pscan)->next)
*pscan=(*pscan)->next;
printf("Database contains %d students.\n",((*pscan)->index+1);
3.问题(solved):这下能顺利运行了,但发现一个问题,记录的数据项数错误,有重复,非递增,我觉得应该是添加数据的AddStudent函数有问题。
short AddStudent(Student student,List *plist)
{
int count=0;
List ptemp;
List pscan=*plist;
if(!(ptemp=(List)calloc(1,sizeof(Node))))
return 0;
ptemp->student=student;
ptemp->next=NULL;
if(!pscan)
{
*plist=ptemp;
(*plist)->index=0;
}
else
{
while(pscan->next)
{
//count=pscan->index;//错,应放在后面一步
pscan=pscan->next;
count=pscan->index;//对,应放在后面一步
}
pscan->next=ptemp;
pscan->next->index=count+1;//如改成++应放在count前面
}
return 1;}
经过探索,pscan进入链表查找最后一项的过程中,局部变量count存储链表index标签计数应该放在进入下一链表之后,另外链表最后一项count更新时,如果用++的话必须放在count之前,否则count始终为1(因为每次调用函数时count归0,造成链表index标签无法递增)
4.问题(solved):第二次循环录入的时候之前录入的数据无法罗列(申请的动态内存被新数据覆盖?函数每调用一次就会申请一次动态内存,所以可能性不大,那么最有可能的就是指针指向的问题)
经排查,问题就是出在自己新添加的一段代码(查找最后一项以显示其index值,莫非在查找的过程中头项的指针变化了?)
while((*pscan)->next)
*pscan=(*pscan)->next;
printf("Database contains %d students.\n",((*pscan)->index)+1);
解决了,将原主函数中的这段代码打包进函数运行,函数返回最后一项的index值。(莫非将这段代码放入函数运行可保护主函数中的指针不被破坏?)
printf("Database contains %hd students.\n",NumberOfList(&man)+1);
short NumberOfList(const List *plist)
{
short count;
List pscan=*plist;
while(pscan->next)
pscan=pscan->next;
count=pscan->index;
return count;}
这时我发现,将这段代码打包进函数后,之前的问题2也跟着被解决了,不用另外生成一个2级指针变量指向一个指向(待保存数据的指针变量所指向的Node结构类型)的指针的指针。看来函数真是好东西。
总算完成这道题了,可以继续学习下一个知识点。