一、静态链表
创建链表中的一个节点,用struct来创建,其中包含两个部分:数据域和指针域。
创建三个结点,node1、node2、node3,分别赋值,初始化为NULL。接着就是将这些节点进行连接,组成链表。连接是通过指针来进行的。头节点是node1,node1的指针指向node2,也就是取node2的地址,以此类推。
随后,再定义一个可移动的指针,初始化指向头节点。 节点数据的遍历就是通过pCurrent = pCurrent->next;这个语句来移动的。一直到最后一个节点,指向为NULL时才结束遍历。并且,每次遍历都进行打印。
代码如下
#include <stdio.h>
struct LinkNode
{
int data;
struct LinkNode *next;
};
int main()
{
struct LinkNode node1 = { 10,NULL };
struct LinkNode node2 = { 20,NULL };
struct LinkNode node3 = { 30,NULL };
node1.next = &node2;
node2.next = &node3;
struct LinkNode* pCurrent = &node1;
while (pCurrent != NULL)
{
printf("%d\n", pCurrent->data);
pCurrent = pCurrent->next;
}
return 0;
}
结果
二、动态链表
动态链表的开辟需要借助malloc函数来实现
首先还是创建节点,一个节点中包括两部分,一部分是数据域,一部分是指针域。
初始化链表。为了能够对实现循环输入,我们利用while(1)来实现死循环
struct LinkNode* pRear = header;同样创建了一个指针,初始化指向头节点
每次创建新的节点执行这句话:struct LinkNode* newnode = malloc(sizeof(struct LinkNode));
记住,每次创建的只是节点,节点的连接需要指针,节点相连就是链表。
pRear->next = newnode;节点的相互连接就是通过这种方式来实现的
pRear = newnode;并且这个可移动的指针会不断的跟新位置。
代码如下:
#include <stdio.h>
#include <stdlib.h>
struct LinkNode
{
int data;
struct LinkNode* next;
};
struct LinkNode* Init_LinkList()
{
struct LinkNode* header = malloc(sizeof(struct LinkNode));
header->next = NULL;
header->data = -1;
struct LinkNode* pRear = header;
int val = -1;
while (1)
{
printf("请输入要插入的数据:\n");
scanf_s("%d", &val);
if (val == -1)
{
break;
}
struct LinkNode* newnode = malloc(sizeof(struct LinkNode));
newnode->data = val;
newnode->next = NULL;
pRear->next = newnode;
pRear = newnode;
}
return header;
}
void for_each_linklist(struct LinkNode* header)
{
struct LinkNode* pCurrent = header->next;
while (pCurrent != NULL)
{
printf("%d ", pCurrent->data);
pCurrent = pCurrent->next;
}
}
int main()
{
struct LinkNode* header = Init_LinkList();
for_each_linklist(header);
return 0;
}
结果