小札记
@ C语言中使用INF时,应该用宏声明以后再用,不能直接使用这三个字母。
声明代码:
#define INF 0x7fffffff
@ C语言中字符数组最后的结束标记'\0'是否必须存在?
通常系统会对字符数组在其最后加上一个'\0',但是字符数组并不要求它的最后一个字符必须为'\0',甚至可以不包含'\0'。是否需要加'\0',完全根据需要决定。
下面的两种初始化都是合法的:
char c_0[6]={'C','h','i','n','a','\0'}; char c_1[5]={'C','h','i','n','a'};
@ C语言中没有getline()函数,如果在C语言中想要使用getline()函数的功能,可以使用fgets()函数来替代,或者是利用getchar()函数自己编写一个具有getline()函数功能的函数。
@ 万能头文件
头文件代码:
#include <bits/stdc++.h>
@ 在一个数组中利用遍历的方式查找某个特定数据时,一般会在循环语句结束后加一个if条件语句,用来判定i是否超过数组范围。如果这种遍历是在函数中时,我们可以在循环语句结束后加一条return i;即可。
例程代码:
int LocateElem(Sqlist L, int x) { int i; for(i = 1; i <= L.length; ++i) { if(x <= L.data[i]) return i; } return i; }
@ 当只能使用一个变量在for循环中完成移动数组下标和记录特殊点下标时,在for循环外申明一个变量p。注意不能在for循环中重复定义p(如下例),否则p只是完成了下标移动,并且在for如循环结束时,p中的内容不是特殊点下标!
在C语言中,不允许在for循环中使用 (int i=0; .... ....)这种生命的,而在C++语言中是可以的,而且几乎必用!所以使用C语言编写程序时,要特别注意这个细节。虽然编译时,编译器会对这个错误进行提示,但是,手一滑~ 咳咳... ... 就滑稽了(-_-)。
int p; for(int i p=0; p<a.length; ++p) { if(a.data[p]>x) break; }
@ 初始化顺序表或是对顺序表进行插入或删除操作时,往往容易忽略顺序表的长度,从而导致执行出错。这种错误表现出来的结果,有时会显得很奇葩(->_<-)。
@ 在某些数据结构辅导书中对两个两表进行归并时,常常会用到free();函数和malloc();函数,这两个函数的头文件在C++语言中是#include <cstdlib>。还有一个问题就是如果在主函数中想要实现多组测试,那么Merge();函数体中的free(B);就不要写了,因为在输入第二组数据时,原来的B就没有了,进而导致执行错误。
#include <cstdlib>
@ 在用尾插法归并两个递增的链表时,要注意尾指针r和p的后移顺序!第一步一定是先将r指向p的、第二步如果是p指针后移p=p->next,则第三步就应该是r=r->next;、而第二步如果是r指针后移则可以是r=r->next或者r=p;,第三步再后移p指针p=p->next;。有时为了使代码好看简洁会写r=p; 但前提是先对r指针执行后移操作,之后再对p指针执行后移操作。为了不出错,在后移r指针的时候还是用r=r->next;稳妥!虽然这是稳妥的写法也符合逻辑,简言之好处多多,但是如果用r=p;这种情况什么时候会出错这种细节一定要知道!
//第二步先后移r指针的两种写法 r->next=p; r=r->next; p=p->next; r->next=p; r=p; //这一步虽然简洁,但是如果先对p指针执行后移操作,这么写就会出错! p=p->next; --------------------------------------------------------------------------------------------------- //第二步先后移p指针的唯一一种写法 r->next=p; p=p->next; r=r->next;
@ 建树时,在建树函数的参数声明中,形参使用引用形式即可。如果将建树函数的返回类型设置为结点类指针型,那么每个根结点的左右孩子指针要分别接收它们自身调用建树函数后的返回值,并且还要在主函数中新建一个结点型指针变量用于保存建树函数最终的返回值。那样做不仅写法麻烦而且需要细致分析,以防止新生成的结点不能链接到所建的树上。总之,那样做将使创建过程由简单明了变得复杂繁琐。如此看来,得不偿失!
void BuildTree(BTNode *&p, int num)//对传入的结点型指针变量,采用引用的写法。 { if(num<10) { p=(BTNode*)malloc(sizeof(BTNode)); p->data=num; BuildTree(p->lchild, 2*num); BuildTree(p->rchild, 2*num+1); } } ----------------------------------------------------------------------------------------------------------------------------- BTNode* BuildTree(BTNode *p, int num)//由于没有采用“引用”写法,一些用“引用”可以轻易解决的事情,就需要自己动脑筋去搞了(->_<-)。 { if(num<10) { p=(BTNode*)malloc(sizeof(BTNode)); p->data=num; p->lchild=BuildTree(p->lchild, 2*num); p->rchild=BuildTree(p->rchild, 2*num+1); return p; } }
@ 声明指针后,除了那些在执行过程中可以确定不会引用未初始化的指针外,其余指针最好依据实际情况进行初始化(一般初始化为空指针)。
@ 如果想要函数返回指针类型,则应该在相应类型后面加上“星号”。注意星号应该紧跟在相应类型的后面,而不是紧贴在函数名前面,这是与声明指针型变量时的区别。另一种“星号”需要紧跟在变量名后面的情况是使用malloc()函数时,注意malloc()函数的头文件在C语言中为 #include<stdlib.h>、在C++语言中为 #include <cstdlib>。
BTNode* BuildTree(BTNode *p, int num) BTNode *p; p=(BTNode*)malloc(sizeof(BTNode));
@ memset()函数的头文件:在C语言中是 #include<memory.h>或者 #include<string.h>;在C++中是 #include<cstring>。用memset()函数对结构体指针数组、字符数组、整型数组初始化如下:
#include <iostream> #include <cstring> using namespace std; typedef struct SqStack { int *data[20]; }SqStack; int main() { char strings[20]; int data1[20]; SqStack st; memset(st.data, 0, sizeof(st.data)); memset(strings, 'a', sizeof(strings)); memset(strings, 'b', 6);//字符型和整型都可以部分初始化。对于指针型由于掌握的甚少,为了避免潜在错误,最好对其全部初始化! memset(data1, 0, sizeof(data1)); for(int i=0; i<20; ++i) if(st.data[i]==NULL) cout<<"The st.data["<<i<<"] is NULL!"<<endl; for(int i =0; i<20; ++i) cout<<"strings["<<i<<"]= "<<strings[i]<<endl; for(int i=0; i<20; ++i) cout<<"data1["<<i<<"]="<<data1[i]<<endl; return 0; }
输出如下:
------------------------------------------------------------------------------------
The st.data[0] is NULL! strings[0]= b data1[0]=0
The st.data[1] is NULL! strings[1]= b data1[1]=0
The st.data[2] is NULL! strings[2]= b data1[2]=0
The st.data[3] is NULL! strings[3]= b data1[3]=0
The st.data[4] is NULL! strings[4]= b data1[4]=0
The st.data[5] is NULL! strings[5]= b data1[5]=0
The st.data[6] is NULL! strings[6]= a data1[6]=0
The st.data[7] is NULL! strings[7]= a data1[7]=0
The st.data[8] is NULL! strings[8]= a data1[8]=0
The st.data[9] is NULL! strings[9]= a data1[9]=0
The st.data[10] is NULL! strings[10]= a data1[10]=0
The st.data[11] is NULL! strings[11]= a data1[11]=0
The st.data[12] is NULL! strings[12]= a data1[12]=0
The st.data[13] is NULL! strings[13]= a data1[13]=0
The st.data[14] is NULL! strings[14]= a data1[14]=0
The st.data[15] is NULL! strings[15]= a data1[15]=0
The st.data[16] is NULL! strings[16]= a data1[16]=0
The st.data[17] is NULL! strings[17]= a data1[17]=0
The st.data[18] is NULL! strings[18]= a data1[18]=0
The st.data[19] is NULL! strings[19]= a data1[19]=0
------------------------------------------------------------------------------------