单链表学习(一)
关于链表的概念,原理,具备的优点和缺点,以及示意图等这里就不过多介绍了。书本上或者百度上,其他博主上都可以了解学习。我主要分享链表的一些基础算法。
直接进入主题吧。
今天分享的是关于链表头节点和数据节点的创建。
我们创建一个链表,一般来说都会创建一个头节点,头节点里面不放然后数据,只需要在指针里面放入下一个数据节点的内存地址就行了,当我们需要访问数据节点的时候就从头节点开始依次访问后面的每一个数据节点。
下面就开始创建头节点,
创建头节点
#include<iostream> #include<stdlib.h> //调用malloc函数实现动态地址的分配 using namespace std; struct node //结构体 { int a; //节点用来存放数据 struct node *next; //用来存放下一个节点的地址 }; int main() { node *head; //定义了一个结构体指针始终用来指向头节点 node *p; //定义了一个结构体指针P用来分配内存空间实现节点的创建 p = (node *)malloc(sizeof(struct node)); //用malloc函数实现节点的创建,其中malloc函数前面需要指明数据类型,结构体是一个数据类型,后面是分配多大的内存,我们通过sizeof计算结构体的大小 p->next = NULL; //我们还没有创建数据节点,所以头节点的next不能存放下一个节点的地址,所以赋值NULL head = p;//将头节点的地址给head,让头指针始终指向头节点 return(0); }
上面的代码成功的创建了一个头节点,并且头节点里面的next指针为NULL(空),head成功指向了头节点。如果头节点里面放了下一个数据节点的内存地址,可以通过head->next去得到下一个数据节点的内存地址,从而实现访问下一个数据节点。
头节点创建好了之后,我们开始创建数据节点。
关于创建数据节点一般有两种方法。
第一种每次创建一个数据节点的时候都直接在头节点后面创建,这样创建出来的链表它的数据节点是倒过来的。最后的在最前面,最先建的在最后面,大家可以想想这个画面。
每次在头节点后面创建数据节点,我们需要完成的操作有:
1.让新创建的数据节点指向它后面的数据节点(也就是比他先创建的数据节点)
2.让头节点指向新创建的数据节点
这样就实现了有序的链表创建
如下图所示,首先创建了头节点,然后再头节点后面插入数据节点1,然后继续再头节点后面插入数据节点2
我将创建节点写在了函数里面,当然也可以直接放在主函数里面,具体需要看你的代码复杂程度。
void node_creat(node *head,int n) //第一个参数用来接收指向头节点的head指针来找到头节点的位置,第二个参数用来接收需要创建多少个数据节点 { node *p; int i; for (i = 1; i <= n; i++) { p = (node *)malloc(sizeof(struct node)); cin >> p->a; //创建的数据节点需要赋值 p->next = head->next; //将头节点指向的数据节点地址给新节点,让新节点指向头节点指向的节点,如果头节点后面没有数据节点,则将NULL给创建的节点。 head->next = p;//在将新创建的节点的地址给头节点,使头节点指向它 } }
通过上面代码实现了第一种数据节点的创建。
第二种数据节点的创建不是每次都在头节点后面创建而是依次创建,如创建了第一个数据节点后,就在第一个数据节点后面继续创建第二个数据节点,这样我们的数据节点就不是倒着的了。
实现上面的创建方法也同样很简单,但是需要多用一个指针来指向每次创建的数据节点,通过这个指针来赋值内存地址。就好像是在头节点后面创建的时候,我们都是用head指针实现创建是一样的。
void node_creat(node *head,int n) { node *p; node *q; //q指针用来指向每次创建的新数据节点 q = head; //首先让q指针指向头节点 int i; for (i = 1; i <= n; i++) { p = (node *)malloc(sizeof(struct node)); cin >> p->a; p->next = q->next; //将q指向的数据节点的值给新创建的数据节点,实际上就是将NULL给了新数据节点的next.因为这样的创建新的数据节点每次都是在最后一个。 q->next = p;//同样的,让q指向的数据节点指向新创建的数据节点 q = q->next;//创建好了之后q移到到新创建的数据节点,又开始在它的后面继续创建 } }
今天分享了关于单链表头节点的创建和数据节点创建的两种形式,后面将继续分享单链表的其他基础算法