水平有限,部分内容仅供参考!
剖析一段链表清空的代码(清空的目标是是链表最后只有头结点)
int linklist_clear(linknode *L)
{
linknode *p = L,*q;
while(p->next) /*free的条件*/
{
q = p->next; /*p始终指向头结点,
p->next = q->next; q始终指向头接点的下一个节点*/
printf("clear : %d ",q->data);
free(q);
q = NULL;/*避免野指针导致内存泄露*/
}
L->next = NULL;/*多余*/
}
22:46 2010/8/16
用三个连续的指针可以实现单链表指针顺序的逆转,注意头和尾的条件还有结束的条件!
int linklist_reverse(linknode **L)
{
linknode *p1, *p2, *p3;
p1 = (*L)->next;
p2 = p1->next;
p3 = p2->next;
p1->next = NULL;
while(p3)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
(*L)->next = p2;
return 1;
}
22:02 2010/8/17
设计线性表的顺序存储结构和栈的顺序存储结构式,可以引入一个位置参数,但要注意这个位置参数的意义,是第几个元素还是数组下标!?
9:42 2010/8/19
/*int linkstack_clear() ->链栈的清空*/->与链表的清空是一曲同工的,我叫这种方法“消积木”!
int linkstack_clear(linknode *S)
{
linknode *p = S->next;
while(p)
{
S->next = p->next;
free(p);
p = S->next;
}
return 1;
}
11:28 2010/8/19
循环队列抽象成一个圆环,明白(S->rear+1)%maxsize的意义,缺点是S->front所指向的数据域始终为空,所以长度为n的数组只能存放n-1个数据!
15:39 2010/8/19
循环队列的实现机制是front和rear互相追逐的过程,入队rear(尾指针)前进,出队front(头指针)前进,当rear追上front时队满,当front追上rear时队空。
code:
int sequeue_enqueue(sequeue *S, datatype x)
{
if((S->rear + 1) % maxsize == S->front)/*判断队满的条件*/
{
printf("queue is full!/n");
return -1;
}
S->rear = (S->rear + 1) % maxsize;
S->data[S->rear] = x;
return 1;
}
void sequeue_traverse(sequeue *S)
{
int i = (S->front + 1) % maxsize;
while(i != S->rear)
{
printf("%d/t", S->data[i]);
i = (i + 1) % maxsize;
}
printf("%d", S->data[i]);
printf("/n");
}
int sequeue_dequeue(sequeue *S, datatype *x)
{
if(S->front == S->rear) /*判断队空的条件*/
{
printf("the queue is empty!/n");
return -1;
}
S->front = (S->front + 1) % maxsize;
*x = S->data[S->front];
return 1;
}
在链表和链队列中设置头结点,可以事半功倍,条理清晰!
17:09 2010/8/19
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用
“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
18:47 2010/8/19-------------------------《高质量C++编程指南》
函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递(pass by reference)。
19:12 2010/8/19-------------------------《高质量C++编程指南》
如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
例如:
void StringCopy(char *strDestination,const char *strSource);
19:15 2010/8/19-------------------------《高质量C++编程指南》