学数据结构对一些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,皆不能求的真确的层数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值