C++ 详解创建链表过程

本人数据库初学者一个,在此记录自己的思考过程,若有疑问以及出错恳请大家一起交流,一起进步!

由于清华大学出版社《C++数据结构与算法》书上并没有给出创建链表的方法,因此在网上查找相关代码,感谢此篇博客https://blog.csdn.net/chixujohnny/article/details/50900504提供相关思路。但对于其中的思想博主并没有详细解答,因此在这里我将围绕着这段代码以个人的一些浅见来说说自己的一些观点。

#include <iostream>
using namespace std;
/* 创建一个单链表 */
struct ListNode{
    int m_key;
    ListNode* next;
};
void createList(ListNode* pHead){
    ListNode* p = pHead;
    for (int i = 1; i < 10; ++i) {
        ListNode* pNewNode = new ListNode;
        pNewNode->m_key = i; // 将新节点的值赋值为i
        pNewNode->next = NULL;
        p->next = pNewNode; // 上一个节点指向这个新建立的节点
        p = pNewNode; // p节点指向这个新的节点
    }
}
int main(){
    ListNode* head = NULL;
    head = new ListNode;
    head->m_key = 0;
    head->next = NULL;
    createList(head);
 
    return 0;
}

从main()函数开始,先是定义了一个ListNode结构类head的指针,指向链表的第一个节点,并初始化;其后为head分配内存,初始化类成员,接着就是进入到创建链表的函数中。

1、将pHead的地址赋予一个类的新指针p,此时p的地址与pHead的地址一样,对p操作就是对pHead操作; 

ListNode* p = pHead;

2、进入for循环,此时i=1

3、创建一个类的新指针pNewNode,作为中间过程为以后存放新节点提供过渡;

ListNode* pNewNode = new ListNode;

4、赋值,令此时的pNewNode的m_key为1,next地址为null;

pNewNode->m_key = i; // 将新节点的值赋值为i
pNewNode->next = NULL;

5、让指针p的next指向pNewNode,此时,由于第一步,因此pHead的next地址也指向pNewNode。这样就实现了pHead的next指向链表中的第一个节点;

p->next = pNewNode; // 上一个节点指向这个新建立的节点

6、将pNewNode的地址赋予p,即将pNewNode的m_key以及next赋予p->m_key为1;p->next为null,此时。此时由于pHead的内存是由new来分配的,其地址不由p改变而改变,因此此时p的地址与pHead的地址不一样,对p操作不咋在等同于对pHead操作,也正因为这样,pHead的next地址将永远指向i=1时的pNewNode,即链表中的第一个节点;

p = pNewNode; // p节点指向这个新的节点

7、当i=2时,又用new新建一个pNewNode,此时需要注意,此时的pNewNode与i=1时新建的pNewNode的地址不一样,即为不同的类对象。因此我们可以将i=1时新建的pNewNode人为的称为pNewNode1,i=2时称为pNewNode2;

ListNode* pNewNode = new ListNode;

8、对pNewNode2->m_key与next赋值;

pNewNode->m_key = i; // 将新节点的值赋值为i
pNewNode->next = NULL;

9、将pNewNode的地址赋予p->next 。此时需要注意,由于第6步,p的地址为pNewNode1的地址,因此对p操作就相当于对pNewNode1操作,所以此时pNewNode1的next地址即为pNewNode2的地址,这样就实现了第一个节点的next指向第二个节点。

p->next = pNewNode; // 上一个节点指向这个新建立的节点

10、将pNewNode2的地址赋予p;

p = pNewNode; // p节点指向这个新的节点

11、以此类推。

 

猜你喜欢

转载自blog.csdn.net/qq_41620518/article/details/81143414
今日推荐