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;