针对插入到一个有序的单链表的小程序所做的调试
2012-03-13 11:08
295 查看
《C和指针》第12章-使用结构和指针
针对插入到一个有序的单链表的小程序所做的调试:
原理都是保存一个指向链表当前节点之前的那个节点的指针。
第一次:函数的参数是指向节点的指针
问题:当插入到链表的起始位置时,需要修改根指针,但此时函数中的根指针只是原指针的一份拷贝,无法修改。可以通过将根指针声明为全局变量来修改它,但这样一来,这个函数只对这个链表起作用。
第二次:函数的参数是指向节点的指针的指针
优点:将指向链表当前节点之前的节点指针初始化为NULL, 通过判断该指针是否为NULL来完善插入到链表起始位置的代码,这次程序可以修改指向起始节点的指针。
问题:必须将插入到链表起始位置作为一种特殊情况。
第三次:把关注点放在需要修改的节点的next字段
分析如下:
typedef struct Node
{
struct Node *next; //注意这里next部分放在前面
int data;
}Node;
需要修改的是某个节点的next段,因此要先保存它,然后指针指向下一个节点。
Node **linkp;
Node *current;
linkp=¤t->next;
current=*linkp;
这段代码中,*linkp是前一个节点的next字段内容,即下个节点的地址。当需要插入新节点时,只需将新节点的next指向current,然后将*linkp修改为这个新节点的地址。与之前的用一个previous指针保存之前节点的指针相比,优点就在于,不需要将起始位置作为特殊情况判断,因为*linkp本身就是指向第一个节点的指针,可以直接修改,而previous初始为NULL,无法取得previous->next.
以下为函数代码:
总结:写出一个正确的程序不难,写出一个好的程序才需要实力。反复调试,精益求精。
针对插入到一个有序的单链表的小程序所做的调试:
原理都是保存一个指向链表当前节点之前的那个节点的指针。
第一次:函数的参数是指向节点的指针
问题:当插入到链表的起始位置时,需要修改根指针,但此时函数中的根指针只是原指针的一份拷贝,无法修改。可以通过将根指针声明为全局变量来修改它,但这样一来,这个函数只对这个链表起作用。
第二次:函数的参数是指向节点的指针的指针
优点:将指向链表当前节点之前的节点指针初始化为NULL, 通过判断该指针是否为NULL来完善插入到链表起始位置的代码,这次程序可以修改指向起始节点的指针。
问题:必须将插入到链表起始位置作为一种特殊情况。
第三次:把关注点放在需要修改的节点的next字段
分析如下:
typedef struct Node
{
struct Node *next; //注意这里next部分放在前面
int data;
}Node;
需要修改的是某个节点的next段,因此要先保存它,然后指针指向下一个节点。
Node **linkp;
Node *current;
linkp=¤t->next;
current=*linkp;
这段代码中,*linkp是前一个节点的next字段内容,即下个节点的地址。当需要插入新节点时,只需将新节点的next指向current,然后将*linkp修改为这个新节点的地址。与之前的用一个previous指针保存之前节点的指针相比,优点就在于,不需要将起始位置作为特殊情况判断,因为*linkp本身就是指向第一个节点的指针,可以直接修改,而previous初始为NULL,无法取得previous->next.
以下为函数代码:
int sll_insert(Node **rootp,int value) { Node *front=*rootp; Node *current; Node *newNode; while((current=*rootp)!=NULL&¤t->data<value) //循环体简单,局部性好 rootp=¤t->next; newNode=(Node*)malloc(sizeof(Node)); if(newNode==NULL) return false; newNode->data=value; newNode->next=current; *rootp=newNode; return true; }
总结:写出一个正确的程序不难,写出一个好的程序才需要实力。反复调试,精益求精。
相关文章推荐
- 向头指针为 L的有序单链表(从小到大有序)中插入一个结点,使插入后链表仍然有序
- 在html里调试CGI程序的一个方法-针对C语言
- 插入到一个有序单链表。
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 设ha和hb分别是两个带头节点的费递减有序单链表的表头指针,设计以算法,将将两个有序链表合成一个非递减的有序单链表,该程序以以前发表的博客中的链表中的区别在与该立案表带有头结点
- 60}的C程序 高手帮忙写下`` 46 35 27 21 16 10 9 5 然后输出数组a。已知 int a[11]={1 使数组a仍然有序 将x插入到有序整型数组a中 由键盘输入一个整数x
- 笔试题:创建一个单链表,结点包含学生的学号,姓名,性别,年龄信息.写几个程序,实现按学生学号插入,查询,删除等操作.
- 在非递减的有序单链表中插入一个值为x的数据元素,并使单链表仍保持有序的操作
- 输入一个数插入有序数组中
- 两个有序单链表合并成一个有序单链表的java实现
- 从键盘上输入一个数,将其插入到数列{2,5,6,8,12,13,15,17,19,22}中,并保证该数列的有序性。
- 实现一个单链表的建立、测长、打印,插入,排序,逆置
- C语言 - ACM题目:第一行输入n m,第二行输入一个数列,n为数列长度,m为要插入的值,排序后输出,m n为零时退出程序
- 一个用js写的接口http调试程序
- 对于一个有序的数组,如果要插入一个元素并保证数组还有序, 问如何获取该元素位置。用二分法
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。
- 微信小程序调试时,点击调试样式按钮时,出现一个警告:‘请先切换至 WXml Pannel’
- 如果一个程序跑10000次只失败一次,你会怎么调试
- 一个方便打印C程序调试信息的宏
- 一个优化程序效率的调试小技巧