CPrimerPlusV6这本书的学习经历总是来说还是比较令人愉悦的,一些课后习题和编程练习尽量不依靠答案完成,有些比较难的题目甚至能花费我半天的时候去钻研,再有些特难的题目,我就先按照答案把代码打一遍有个初步了解,然后再自己打一遍,有时候头脑思维发散一些还能对习题要求进行再拓展,其他内容基本上还好,但是文本操作的内容有些忘记了我觉得过后还是需要再复习一下,毕竟操作文本储存数据也算计算机的实用性体现。有些C99的内容由于我的IDE是VS2010支持不了,所以也是跳过没学了。

      CPrimerPlusV6目前学到第十七章-高级数据表示,据说这是数据结构的内容,数据结构的书《数据结构与算法分析-C语言描述》我只看了几眼觉得很难就先放一边了,现在在琢磨这个ADT抽象数据类型-17.3,我感觉通过这个习题我发现自己的指针基础还是很薄弱。我本来计划将原本的List(指向Node结构类型的指针变量)更改成List(新建立的list结构类型的变量,list结构类型包含指向Node结构首项的指针、指向Node结构尾项的指针、Node结构计数),运行后链表只能保存输入的最后两项内容,琢磨了一下午都没搞懂,我只能改回与书本一致的方法,等以后指针内容学习扎实再说。我现在又想在Node结构中添加一个记录当前项目数的标签,这个标签添加后可以读取存储的项数。

问题(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);

问题(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标签无法递增)

问题(solving):第二次循环录入的时候之前录入的数据无法罗列(被覆盖?)