链表
1.头插法链表
链表的头插法首先需要定义初始化一个头结点HEAD,每次新的节点插入到链表中都插入到头结点HEAD之后前次插入节点之前具体看以下框图
1.具体的操作如下:
数据结构data_demo
struct data_demo {
struct data_demo *next;
}
1.首先创建一个头结点HEAD,并且HEAD的下一个节点指向空
struct data_demo *HEAD;
HEAD->next = NULL;
2.创建一个新的node1插入到链表中
struct data_demo *node1;
node1->next = HEAD->next; //将HEAD->next的指向赋值给node1->next
HEAD->next = node1; //HEAD->next指向node1节点
3.创建一个新的node2插入到链表中
struct data_demo *node2;
node2->next = HEAD->next; //将HEAD->next的指向赋值给node2->next
HEAD->next = node2; //HEAD->next指向node2节点
为什么要先执行node2->next = HEAD->next再执行HEAD->next = node2呢,如果我们先执行HEAD->next = node2后,我们就找不到之前
头结点指向的后驱节点吗,所以我们需要先把头结点指向的后驱节点先赋值给当前node2,然后再把HEAD节点的next指向node2
2.头插法代码实现例子
#include <stdio.h>
#include <stdlib.h>
typedef struct list_demo {
int data;
struct list_demo *next;
}List;
void InitHeadList(int i, List *HEAD)
{
List *node = NULL;
for(i = 0;i < 3; i++)
{
node = (List*)malloc(sizeof(List));
node->data = i;
node->next = NULL;
node->next = HEAD->next;
HEAD->next = node;
}
}
void PrintList(List *HEAD)
{
while(HEAD !=NULL)
{
printf("node data:%d\n", HEAD->data);
HEAD = HEAD->next;
}
}
int main(void)
{
int i = 3;
//创建头结点
List HEAD;
HEAD.data = 200;
HEAD.next = NULL;
InitHeadList(i, &HEAD);
PrintList(&HEAD);
return 0;
}
执行的结果:
node data:200
node data:2
node data:1
node data:0
2.链表的尾插法
链表的尾插法的实现是把每次新创建的节点都插入到链表的尾节点后,因此我们需要创建一个尾部指针tail来记录当前的位置,每次有新的节点插入
都需要把这个指针指向当前插入的节点
1.具体操作如下
数据结构data_demo
struct data_demo {
struct data_demo *next;
}
1.创建头结点和尾部指针,并且把tail指向HAED
struct data_demo *HEAD, *tail;
HEAD->next = NULL;
tail = HEAD;
2.创建node1节点,使用尾插法插入到HEAD后
struct data_demo *node1;
tail->next = node1;
tail = node1;
tail ->next = NULL;
3.创建node2节点,插入到链表中
struct data_demo *node2;
tail->next = node2;
tail = node2;
tail ->next = NULL;
2.尾插法实现例子
#include <stdio.h>
#include <stdlib.h>
typedef struct list_demo {
int data;
struct list_demo *next;
}List;
void InitHeadList(int num, List *HEAD)
{
List *node = NULL;
int i = 0;
for(i = 0;i < num; i++)
{
node = (List*)malloc(sizeof(List));
node->data = i;
//node->next = NULL;
node->next = HEAD->next;
HEAD->next = node;
}
}
void InitTailList(int num, List *HEAD)
{
List *node = NULL;
List *tail = HEAD;
int i = 0;
for(i = 0; i < num; i++)
{
node = (List*)malloc(sizeof(List));
node->data = i;
tail->next = node;
tail = node;
}
tail->next = NULL;
}
void PrintList(List *HEAD)
{
while(HEAD !=NULL)
{
printf("node data:%d\n", HEAD->data);
HEAD = HEAD->next;
}
}
int main(void)
{
int i = 3;
//创建头结点
List HEAD;
HEAD.data = 200;
HEAD.next = NULL;
//InitHeadList(i, &HEAD);
InitTailList(i, &HEAD);
PrintList(&HEAD);
return 0;
}
执行结果:
node data:200
node data:0
node data:1
node data:2