生活随笔
收集整理的这篇文章主要介绍了
链表之双向链表
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
又是敲代码学习的一天,虽然学的很痛苦,但是看到自己学完后有成果出来还是 很高兴的。
接下来废话不多说直接上代码,代码里有各个函数的解释说明,贯穿着我对这个双向链表的理解
typedef struct Node
{int data
; Node
* left
; Node
* right
;
}Node
;
Node
* createHeadNode()
{Node
* headNode
= (Node
*)malloc(sizeof(Node
));headNode
->left
= headNode
->right
= NULL;return headNode
;
}
Node
* createNode(int data
)
{Node
* newNode
= (Node
*)malloc(sizeof(Node
));newNode
->data
= data
;newNode
->left
= newNode
->right
= NULL;return newNode
;
}
void headAddNode(Node
* headNode
,int data
)
{Node
* newNode
= createNode(data
);if (headNode
->right
== NULL){headNode
->right
= newNode
;newNode
->left
= headNode
;}else{headNode
->right
->left
= newNode
;newNode
->right
= headNode
->right
;newNode
->left
= headNode
;headNode
->right
= newNode
;}
}
void tailNodeData(Node
* headNode
,int data
)
{Node
* newNode
= createNode(data
);Node
* proPMove
= headNode
;Node
* pMove
= headNode
;while (pMove
){proPMove
= pMove
;pMove
= pMove
->right
;}proPMove
->right
= newNode
;newNode
->left
= proPMove
;
}
void printNodeData(Node
* headNode
)
{Node
* pMove
= headNode
->right
;while (pMove
){printf("%d-->", pMove
->data
);pMove
= pMove
->right
;}printf("\n");}int main()
{Node
* List
= createHeadNode();for (int i
= 0; i
< 10; i
++){headAddNode(List
, i
);}printNodeData(List
);tailNodeData(List
, 11);printNodeData(List
);return 0;
}
看了这么多了,是不是很累了,再坚持一下,或者休息一下再来看
其实这个双向链表还有别的实现方式–借助第二个结构体
typedef struct List
{int size
; List
* head
; List
* tail
;
}List
此时的你经过上面的双向链表的学习,有没有一点想法。有没有想实现双向循环链表。
这时你会有灵感吗?
如果没有的话,那我来提醒一下你。其实这时候你只要将这个双向链表的left的NULL赋为最后一个节点的地址,最后一个节点的right赋为头节点的地址。这样不就头尾连接起来了。是不是很神奇。
那这样有思路了,剩下的就交给你来实现了。代码我就不写了,如果有遇到什么问题可以私信我哦,有空看到了会回复的。
好了,今天就先写到这里了,好困太晚了,先睡了。。
总结
以上是生活随笔为你收集整理的链表之双向链表的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。