typedef 与 指针连用

typedef struct LNode{  // Singly linked list Node
     int    data; 
     struct LNode   *next;   // Pointer to next node
}LNode,*LinkList;




int ListInsert_L(LinkList  &L, int i, int e)
{  LinkList s,p;
   int j;
   p = L; j = 0;
   while(p&&j<i-1){p=p->next;++j;}
   if(!p||j>i-1) return 0;
   s = (LNode *)malloc(sizeof(LNode));
   if(!s) return 0;
   s->data = e; 
   s->next = p->next; p->next = s;
   return 1;      }


 typedef  struct LNode LNode;

 typedef  struct LNode *LinkList;

第一个好理解,是为struct LNode 创建一个简单的别名,以后就用LNode代替它了。

那第二个理解成什么呢?我开始就理解成了指向这个LNode的指针LinkList.

但是这个函数调用里面吧,却把LinkList当成了一个别名或者一个类型,那是不是理解成因为有了typedef就创建了一个LinkList指针代表所有指向这个结构的指针。



后在百度知道里面找到了答案,证明我的猜测是正确的:

 
 
typedef struct 
{
...
}*Pstr; 
这个指针怎么用法?

 
举一个相似的例子,一般指向整型的指针都是如下使用的: int *p ; 指向一个整型的指针。 如果,在前面我们使用了 typedef int * Pint; 则上面的声明方法,可以改为: Pint p;同样是声明一个指向整型的指针。 上面的结构体是一样的。也同样理解。
 
 
例如:
tyoedef int *Pint;
表示的意思并不是定义一个指向int型指针,而是表示定义一种新的数据类型,这种类型是指向int型的指针,那么如果下面有Pint a;则这时的a是指向int型指针
同理
typedef struct 
{
...
}*Pstr; 
表示定义一种数据类型,该类型是指向结构体的
所以下面如果有*Pstr  p;则p是一个指向结构体的指针
但是很显然p是悬垂指针,而题中这种情况是不能静态分配数据的
所以可以动态的分配一个空间来让p有所指向
C++可以这么做:p=new *p
C没有new语句,那么可以这么做:p=(Pstr)malloc(sizeof(*p));
全手打的,希望对你有帮助 
第二个疑惑:

insert函数里面为什么有个地址符,后来经过程序调试后,我觉得有没有这个地址符没有任何影响,因为本身L就被定义了是LinkList型的也就是说它指向的是这个结点结构的指针,里面本身存在的就是个地址,然后直接赋值给p。

地址符的作用应该是传进地址,如果说改成这样的int ListInsert_L(LinkList *L, int i, int e) 那么等于就是说L应该是指针的地址,调用的时候应该用&,而在里面赋值的时候应该是 p = *L;

你可能感兴趣的:(c,list,struct,百度,insert)