详解:创建链表的过程(为什么我们要使用为指针)
如何创建一个链表呢?
首先要明白结点的构成部分:
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){
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
