C链表新建头结点和新结点问题?

单链表结构体:
typedef struct LNode{
Elemtype data;
struct Lnode *next;
}LNode,*LinkList;
为什么创建头节点用
L=(LinkList)malloc(sizeof(LNode));
而创建新节点用
s=(LNode*)malloc(sizeof(LNode));
明明前面定义是LinkList带*,Londe不带*,为什么到语句中变了??
Linklist与Lnode*区别在哪?

带头节点:head-> p1->p2->p3 ->p1->p2->p3-> p1.....
不带头节点: p1->p2->p3 ->p1->p2->p3-> p1.....
却别还不明显吗?带头节点可以方便,快速的定位链表第1个节点
比如循环链表的时候,删除p1 的时候:
head->next = p2;
p3->next = head->next; ok?
free(p1);
思路很清晰,链表开始的第1个节点现在就是head->next 即 p2
否则没有头节点:
p3->next = p1->next;
free(p1);
会不会有一种链表第1个节点到底是哪个的感觉?
当然单向循环这个不明显,如果你写个双向循环,就会很方便,麻烦,我就写单向吧``
就是方便,清晰,明了,也不是一定要用,要看情况,看需要对链表做什么操作,来决定要不要带头节点。你不写几个链表没法体会的。
祝你好运!~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-11-26
你得理解malloc(sizeof(LNode))返回值的含义;和Linklist与Lnode*所代表的含义。才能知道区别在哪里。malloc(sizeof(LNode))返回的是一个地址。Linklist与Lnode*将返回值转换成该类型的地址
第2个回答  2019-11-25
定义中LinkList前的*号声明它为指针变量,所以在语句中作强制类型转化表示地址和该指针变量指向的变量的地址类型匹配。Lnode*则是表示指向Lnode类型变量的地址又一写法。本回答被提问者采纳
第3个回答  2019-11-25
*linklits是指向LNode结构体类型的指针变量。LNode是LNode结构体类型的变量名。
第4个回答  2019-11-25

相似回答