您的位置:首页 > 理论基础 > 数据结构算法

学数据结构对一些C语言语法的反思

2012-08-10 22:23 183 查看
第一个反思: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,皆不能求的真确的层数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: