单链表typedef struct与指针连用

来源:互联网 发布:如何设置bios网络唤醒 编辑:程序博客网 时间:2024/06/05 04:59

这学期开设了《数据结构课程》,在第二章单链表基本操作出现了一个很难理解的问题,先将书里代码写下来:

typedef struct LNode{
char data;
struct LNode *next;
}LNode,*LinkList;

这是定义链表结点的结构体,并且采取了typedef操作。typedef意思我就不多说了,简单来说就是结构体别名操作,而里面char data是指数据域,struct LNode *next是指针域,链表的后继指针是指向下一个结点的地址,因此,指针是struct LNode *类型的。这里重点要说的是LNode,*LinkList的含义。

第一个很简单:LNode为struct LNode{}创建了一个别名,以后用LNode来代替struct LNode,

第二个很重要:在后文的函数调用过程中,发现了void InsertList(LinkList *L),由此可见,LinkList居然成了一个类型,因此这里可以初步判断是创建LinkList类型的指针,代替所有指向这个结构的指针。

另外一个例子:

int *p; //指向int的一个指针

typedef int * Pint; //定义了一个Pint类型,这个类型不是指针,而是这种类型是指向int 的指针。

Pint p; //指向int的指针

再举一个例子:

typedef struct Lnode

{

}*Pstr;

Pstr是一种数据类型,这种类型指向结构体。如果说使用Pstr q;这里就可以看出q是指向结构体的指针,这个指针是悬垂指针,相当于野指针,因此在C++中应该这样操作分配内存空间:q = new(Lnode);C语言中使用malloc函数:q = (Pstr) malloc (sizeof(Lnode))

第二个问题:

先贴代码:

int ListInsert(LinkList &L, int i, char e)
{
LinkList p =L,s;
int j = 0;
while(p&&j<i-1)
{
p = p->next;
++j;
}
s = new(LNode);
s->data = e;
s->next = p->next;
p->next = s;
}

insert函数里面为什么有个地址符,后来经过程序调试后,我觉得有没有这个地址符没有任何影响,因为本身L就被定义了是LinkList型的也就是说它指向的是这个结点结构的指针,里面本身存在的就是个地址,然后直接赋值给p。
地址符的作用应该是传进地址,如果说改成这样的int ListInsert_L(LinkList *L, int i, int e) 那么等于就是说L应该是指针的地址(指针的指针,LinkList指向结构的指针),调用的时候应该用&,而在里面赋值的时候应该是 p = *L;

如果你还不懂,还可以参考这篇文章:http://bbs.csdn.net/topics/320137702

百度知道也给出了这样的回答:点击查看

详细文章参考:灯火编程小站www.getitcode.com

0 0
原创粉丝点击