Linux C 笔记2.0

水平有限,部分内容仅供参考!

剖析一段链表清空的代码(清空的目标是是链表最后只有头结点)
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++编程指南》


 

你可能感兴趣的:(编程,c,linux,语言,reference,2010)