學數據結構對一些C語言語法的反思

第一個反思: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,皆不能求的真確的層數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章