第一個反思:typedef與結構體的反思
例1.1
typedef struct LNode {
int data;
struct LNode *next;
}LNode_A;
這個是在學習鏈表時,其定義的一個結構體引起的反思。
typedef在C中的語法:①給已有的數據類型(char int long)定義一個別名,例如 tyepdef int bit_4;
②簡化比較複雜的結構類型聲明;此例子正事如此。
該代碼應該可以看成三部分組成:
typedef struct LNode {
int data;
struct LNode *next;
}LNode_A;
大紅色部分爲聲明一個名爲LNode的結構體類型,typedef “紅色部分” LNode_A 這一句是給結構體LNode取個別名LNode_A.
那這樣做的好處在哪裏呢?
如果你要聲明一個結構體變量,可以由原來的struct LNode a 簡化爲 LNode_A a;
則例1.1也可以寫成:
typedef struct LNode {
int data;
LNode_A *next;
}LNode_A;
另外,要注意“結構體類型定義”與“結構體變量定義”的區別
struct A{
......
......
};
以上代碼是結構體類型定義,定義{}中的結構爲一個名詞爲“A”的數據類型;
struct {
.......
.......
}A;
以上代碼是結構體變量定義,其中A爲一個匿名的結構體數據類型的變量。A的本質是變量,是佔用內存空間的。
更詳細的結構體說明,參考鏈接http://wenku.baidu.com/view/4a1f961859eef8c75fbfb384.html
第二個反思:指針作爲函數參數傳遞
在鏈表章節中,一開始我很不解,爲什麼傳遞鏈表的頭指針時,形參定義的是Linklist *L,而Linklist本身就是一個結構體指針,也就是說,用的是指向指針的指針;
看兩端代碼:
程序1:
void myMalloc(char *s) //我想在函數中分配內存,再返回
{
s=(char *) malloc(100);
}
void main()
{
char *p=NULL;
myMalloc(p); //這裏的p實際還是NULL,p的值沒有改變,爲什麼?
if(p) free(p);
}
程序2:
void myMalloc(char **s)
{
*s=(char *) malloc(100);
}
void main()
{
char *p=NULL;
myMalloc(&p); //這裏的p可以得到正確的值了
if(p) free(p);
}
這是爲什麼呢?按理說指針做參數,傳遞的就是地址,但是是哪裏出錯呢。
請看圖解
指針變量,本質上也是變量,只是變量中存放的是地址。假設s是實參,q是形參。傳參後,s和q同時指向地址A。在子程序中malloc申請一片內存空間首地址爲D,賦給指針q。但是指針s所指向的地址不變。所以..................
更詳細的指針傳參請參考:http://blog.csdn.net/cffishappy/article/details/6909950
第三個反思:遞歸中傳參時“++”、“--”的反思
看下面程序:
///對二叉樹遍歷,查找元素爲‘d’,並顯示d的層數
void DisplayBittree(BitTree *t,int i)
{
if (*t)
{
BitNode *p;
p=*t;
ElemType e;
e=p->data;
if (e=='d')
{
printf("%d\n",i);
return ;
}
else
{
DisplayBittree(&((*t)->lchild),i+1);
DisplayBittree(&((*t)->rchild),i+1);
}
}
}
DisplayBittree(&((*t)->lchild),i+1);
DisplayBittree(&((*t)->rchild),i+1);
這2句改爲i++或者++i,皆不能求的真確的層數。