详解:创建链表的过程(为什么我们要使用为指针)

如何创建一个链表呢?

首先要明白结点的构成部分:

struct listNode{int data;listNode *next;
};

一个结点有两个组成部分:一个是数据域,另一个是指针域。
当我们要使用它的时候,比如说,给数据域赋值,则使用:p->data = num;链接下一个结点,理解为给指针域赋值:p->next = pNew;

为了完整地还原整个过程(实际上用视频更好解释哈哈哈)。

# include 
using namespace std;//结点格式
struct listNode{int data;listNode *next;
};
//声明链表创建函数
listNode * createList(int n);//主函数
int main(){int n;cin >> n;listNode *listHead = NULL; //创建头指针的同时初始化if (n > 0)listHead = createList(n); //createList()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHeadreturn 0}void listNode *createList(int n){//创建一个不存放有效数据的头结点pHead = new listNode;  //给头结点分配空间if(pHead == NULL){cout << "error" << endl;return -1;}listNode *pTail = pHead;//创建尾节点(为什么创建尾节点之后再说)pTail->next = NULL:for(int i = 0; i < n; i++){int num;cin >> num;pNew = new listNode;  //创建新的结点并分配空间if(pNew == NULL){cout << "error" << endl;return -1;}pNew->data = num;pNew->next = NULL;pTail->next = pNew;pTail = pNew; //pTail向后移动(简单记法:pTail要指向哪一个,就把它放在左边)}return pHead;
}

以上是一个链表的完整创建过程。
以下来逐行解释下:
(1)

# include 
using namespace std;//结点格式
struct listNode{int data;listNode *next;
};
//声明链表创建函数
listNode * createList(int n)

创建链表的前驱工作,一些必要的声明和结点的条件。

(2)

listNode *listHead = NULL; 

这是创建头指针并且进行初始化。每一个链表都要有头指针,这样才可以找到整个链表。换句话说,头指针是链表的充分必要条件。

(3)

listHead = createList(n);

头指针指向链表,或者说,将链表的地址给了头指针。这样,整个表可以找到了。

(4)

pHead = new listNode;  //给头结点分配空间if(pHead == NULL){cout << "error" << endl;return -1;}

创建头结点并且给头结点分配空间,头结点虽然说不一定是必要的,但是,为了后面结点方便处理,还是最好创建一个不放置有效数据的头结点。同时,头结点的位置不要随意移动,因为头指针指向的就是头结点的位置。

(5)

listNode *pTail = pHead;//创建尾节点(为什么创建尾节点之后再说)pTail->next = NULL:

创建尾节点并且初始化。尾节点的初始地址和头结点是一样的。尾节点的指针域经过处理后永远是NULL。

(6)

for(int i = 0; i < n; i++){int num;cin >> num;pNew = new listNode;  //创建新的结点并分配空间if(pNew == NULL){cout << "error" << endl;return -1;}pNew->data = num;pNew->next = NULL;pTail->next = pNew;pTail = pNew; //pTail向后移动(简单记法:pTail要指向哪一个,就把它放在左边)}

用for循环创建结点。
先让结点初始化,“pNew->data = num; pNew->next = NULL;”,接着,让尾指针指向新的结点,也就是把新结点的地址给了尾指针,尾指针移动到了新结点的位置

现在来说说,为什么要创建尾指针?
我们首先达成共识:头结点是一定不能随意移动的。假设我们没有设置尾指针,那么就要让头结点的位置随着新结点移动,“pHead->next = pNew;”在建立第二个新的结点的时候,依然这样做,会发现,第一个建立的结点不见了,因为头指针永远指向头结点(pHead)的位置。这样循环下去,得到的只会是最后一个有效结点。
而创建一个尾指针,很好地避免了这种情况。

在这里插入图片描述(7)

return pHead;

最后一步,返回头结点的位置。

整个链表创建完毕。

PS.链表创建函数的返回值写错了,应该是:

listNode *createList(int n){
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部