上次说到,一个完整的链表是由若干个节点组成的,那么在了解链表的基础知识后就要知道如何创建节点和插入节点,以及将链表遍历输出
1.创建节点
在创建节点之前,我们已经创建好了结构体和表头
//创建结构体
struct Node
{
int data;
struct Node* next;
};
//创建表头
struct Node* createlist()
{
struct Node* head = (struct Node*)malloc(sizeof(struct Node));
head->next = NULL;//头节点指向空
return head;
}
现在就要开始写一个创建节点的函数,以我们的数字链表为例,我们需要如下步骤
用代码实现如下
//创建节点
struct Node* createNode(int num)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = num;
newNode->next = NULL;
return newNode;//返回节点的地址
}
2.插入节点
创建节点之后便需要将节点插入,而实际上更多的是将节点创建出来之后便插入,也就是说在插入的函数里嵌套调用创建链表的函数。插入也分为表头插入,表尾插入,乃至在中间插入。本文将介绍表头插入和表尾插入两种方式
(1)表头插入
表头插入顾名思义就是在表头的位置插入节点
第一步:创建一个新的节点
第二步:将新节点与头节点及头节点之后的节点相连
第三步:形成新的链表
接下来用代码来实现一下
//表头法插入
struct Node* insertByHead(struct Node*head,int num)
{
struct Node* newNode = createNode(num);//指向新节点的指针
newNode->next = head->next;
head->next = newNode;
return newNode;
}
也就是说在创建新节点然后插入到表头
(2)表尾插入
表尾插入也就是将新创建的节点接在最后一个节点后面,这也是较为常用的一种插入方式,先通过图来详细看一下过程,过程与上面的表头插入类似,但多了一步寻找表尾
第一步:创建新的节点
第二步:从前到后寻找到最后一个节点
第三步:将新节点与原最后一个节点连接
第四步:形成新的链表
下面用代码来实现一下,比表头插入多了一个从头到尾寻找的步骤,因此也多出了几行代码
//表尾法插入
struct Node* insertByEnd(struct Node* head, int num)
{
struct Node* newNode = createNode(num);//指向新节点的指针
while (head->next != NULL) //从头到位一直往后,直到找到最后一个节点
{
head = head->next;
}
head->next = newNode; //将新节点接在原最后一个节点后面
return newNode; //返回一个地址
}
可以看到与上面不同的是,这里多了一步从前到后查找的步骤
链表遍历
链表的遍历与数组的遍历类似,都是利用循环来完成的,但与数组遍历不同的是数组遍历可以利用循环控制变量来完成,而链表得到遍历大多需要判断节点是否为空
//链表的遍历
void printlist(struct Node* head)
{
head = head->next; //头节点一般不存放数据
while (head != NULL) //当节点不为空时即执行循环
{
printf("%d ", head->data);
head = head->next; //输出后移向下一节点
}
printf("\n");
}
(完)