链表的定义中,struct Node和Node的区别(在线等,急!!)

typedef struct Node{...}LNode;
以上定义中,是不是可以去掉第一个Node?然后依然可以得到新类型LNode

typedef struct Node* Linklist;
以上定义中,既然已经自定义了LNode类型,为什么不这样写:typedef LNode* Linklist;
而还要用 struct Node呢?

struct //是C中的结构体的关键词。
如: stuct node{

/* node 相当于结构体的类型,关键是!
其实在C中stuct node 才相当于一个数据类型,如int ,所以在才会给初学者的带来困难,如在定一个变量时,要用 struct node xxx,而不是 node xxx 这就是关键。
*/
int a;
.....
} a; //

a是结构体的变量

而 typedef // 是自定义数据类型。
如:typedef int zengshu // 把一个数据类型用一个直观的数据类型名代替,增加程序的可移植性。
而且 typedef struct node {

}A;
则是把 struct node 看做一个数据类型(见关键处),不同的是这个结构体类型的定义也放在后面。 而A则是那个直观的数据类型名,引用的时候更加方便。

第一个问题:可以,如果去掉typedef 就可以
第二个问题:可以这样写. 我测试的代码:可以通过
#include
#include
typedef struct
{
int a;
float b;
}aaa;

typedef aaa* bb;

int _tmain(int argc, _TCHAR* argv[])
{

bb c=(bb)malloc(sizeof(aaa));
c->a =4;
printf("%d\n",c->a);
free(c);
return 0;

}
而且可以直接typedef struct Node{...}LNode,* Linklist ; 然后Linklist就是指针结构了.

typedef已经将 struct Node{...} 定义为了 LNode,因此可以直接用LNode* Linklist 定义结构体指针,相当于 struct Node * Linklist

#include "malloc.h "
#include "stdio.h"
这2个没显示出来,可能是csdn过滤了尖角号,换成""也可以

struct Node{

  int a[10];

  int length;

}


int  main(){

  Node* a;

 initNode(a);

  return 0;

}

错误方法:

   void initNode(Node *a){

     a = (Node*)malloc(sizeof(Node));

      a->lenght=0;

}

它不会改变main函数中的a原因是main中传入的是地址给initNode方法中的a而a第一句是重新申请个地址,所以它的地址不是原来的。它已经脱离了main中a它的改变对main中那个变量没有一点影响

正确的方法:

 void initNode(Node* &a){

  a = (Node*)malloc(sizeof(Node));

   a->lenght=0;

}

它的含义就是把main中那个指针变量等价与initNode中的这个指针变量。它们为同一个指针。为什么了,我想是它传入的是存储指针的地址而不是指针指向地址。为了理解就认为它就把自己传入。

另外有个误区对与数组int a[10];我们不能这样

 void initArray(int a[]){

a = {1,2,3,4,5,6,7};

}

a在是数组的首地址,它是个常量你这要做的意思是把a的地址又改变了,常量怎么可以改变了。。。。就如1不能为2

  1. LNode相当于结构体Node的别名,当然也可以将Node去掉,写成:typedef struct {...}LNode,并且完全可以写成typedef LNode* Linklist;的形式。
  2. 但是在代码设计中变量命名的统一也很重要,你后面定义的各种结构体名称如LNode 或者 LinkList理论上都属于一个链表的一个节点(Node),所以Node结构体的定义就尤为重要了。所以为了代码的统一和代码的可读性,可以理解为如下形式: typedef struct Node{...}; typedef struct Node* LNode; typedef struct Node* Linklist;

typedef struct Node{...}LNode;
以上定义中,是不是可以去掉第一个Node?然后依然可以得到新类型LNode
这个Node是可以去掉的,前提是你在结构体内部不使用struct Node类型定义其他变量。

typedef struct Node* Linklist;
以上定义中,既然已经自定义了LNode类型,为什么不这样写:typedef LNode* Linklist;
而还要用 struct Node呢?
可以写成typedef LNode* Linklist;
测试代码如下

int main()
{
    typedef struct 
    {
        int a;
    }LNode;
    LNode b;
    typedef LNode* link;
    link c = &b;
    c->a = 10;
    printf("%d \n",c->a);
}