CPrimerPlusV6-感想-20211028

 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结构类型)的指针的指针。看来函数真是好东西。

总算完成这道题了,可以继续学习下一个知识点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fleet1126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值