(第一章)不带头结点链表例题的小问题

1.空链

h

2.预编译

h

3.编写头文件

目的:有些代码在程序中会被经常用到,编写成头文件可以节省时间,避免代码的重复编写。

h

4.初始化函数中的问题

(1)如果使用返回值方式(不合适)

POINT *initPointLink(POINT *head){

     if(head == NULL){

     head = (POINT *)malloc(100);

}

     return head;

}

void main(void){

    POINT *head1 = NULL;

    POINT *head2 = NULL;

    head1 = initPointLink();

    head1 = initPointLink();

// 第一次运行时,head1被赋值为所申请得到的空间;

// 第二次运行时,head1原来空间的首地址值被第二次申请的空间首地址值所覆盖;

// 这使得第一次所申请的空间不再能被“掌控”,这称为严重的“内存泄露”!

}

 

不能使用上述方案,则,需要选择“参数传递”更改主函数的相关指针。

 

(2)选择“参数传递”方式 值传递 (错误)

void initPointLink(POINT *head){

    // head是initPointLink()函数的局部变量,是initPointLink()函数在调用时才开始申请空间的变量;

    // head空间与主函数的head2变量空间在内存的不同的地方。

    if(head == NULL){

    // 在函数被调用时,根据实参与形参的“值传递”,主函数的head2的,被赋值给head。

    head = (POINT *)malloc(100);

    // 现在,修改了head空间的值,但是,对于另外的空间head2,没有任何影响。

    }

}// 当返回主函数后,主函数的head2空间的值没有变化!

void main(void){

    POINT *head1 = NULL;

    POINT *head2 = NULL;

    initPointLink(head2); // head2的4字节空间是只能在main()函数引用的。

}

 

(3)选择“参数传递”方式 址传递 (正确)

void initPointLink(POINT **head){

   ...

}

void main(void){

    POINT *head1 = NULL;

    POINT *head2 = NULL;

    initPointLink(&head1); 

}

 

(4)录入完整代码

initPointLink(POINT **head){
    //实现从键盘上输入若干个点的坐标,并将这些点坐标形成单向不循环链表
    int row;
    int col;
    POINT *p;
    POINT *q;  //q始终指向末节点

    //若head所指向的空间其值为NULL,说明相关指针没有指向任何已经存在的指针,否则,不能进行初始化操作
    if(*head != NULL){   
        //*某,在=左侧,应念做:“某”所指向的空间;
        //*某,在=右侧,或者在“表达式”中,应念做:“某”所指向的空间的值;
        //此式为表达式,故应读作:head所指向的空间的值

        return;
    }

    printf("提示:任意行或列值为0,则结束输入\n");

    printf("请输入点坐标(例如:3 4)");
    scanf("%d%d", &row, &col);


    while(row != 0  && col != 0){
        //处理点坐标
        p = (POINT *)malloc(sizeof(POINT));
        p->row = row;
        p->col = col;
        p->next = NULL;

       
        //要把p所指向的这个点链接到主链中
        if(*head == NULL){
            *head = p;
        }else{
            q->next = p;
        }
        q = p;

        printf("请输入点坐标(例如:3 4)");
        scanf("%d%d", &row, &col);
    }
}

分析:

1)

 

2)

 

3)

 

5.输出函数中的问题

【软件工程】编程大技巧:

将一个点坐标的输出操作独立成函数,有如下几个好处:

1)符合模块功能原子化原则;一个功能函数只完成相对独立、小、少的功能,有利于程序的维护和层次化;

2)将showPoint()实现后,若出现对输出形式的修改,则,只需要修改这个函数,而所有调用该函数的语句无需更改;

3)用这种思想,可以在编程初期,逐渐形成自己的“语言环境”(被一个日本程序员称为“微语言环境”),则,利于以后的软件开发;因此,形成了很多小而实用的模块,以后的编程就成为“搭积木”。实质上,相当于在编程初期,扩充了C库函数!

6.查找函数中的问题

指向函数的指针:

猜你喜欢

转载自blog.csdn.net/weixin_42072280/article/details/82950313