头插法:
插入:
注意:第一个步骤跟第二个步骤不能反过来,否则会造成链表丢失
二次插入:
最后:
用代码实现:
#include <stdio.h>
#include <malloc.h>
typedef struct _Node {
int data; //数据域
struct Node* next; //指针域
} Node; //定义一个节点类型
int main() {
int i;
Node* headnode, * newnode; //将Node的地址用指针保存起来
headnode = (Node*)malloc(sizeof(Node)); //给头节点分配一个Node大小的内存空间使得指针可以指向节点的数据域跟指针域
headnode->next = NULL; //初始化头节点
printf("请输入数据\n");
for (i = 0; i < 3; i++) {
newnode = (Node*)malloc(sizeof(Node)); //给新节点分配一块内存空间
scanf("%d", &newnode->data); //给新节点输入数据
//头插法代码
newnode->next = headnode->next; //将新节点插入到头节点的next域
headnode->next = newnode; //在将头节点的next域链接到新节点
}//用for循环实现输入一个数据就生成一个新节点
//历遍链表,输出链表内的数据
Node* p;
p = (Node*)malloc(sizeof(Node));
p = headnode->next;
while (p != NULL) {
printf("%2d", p->data);
p = p->next;
}
}
最后 输出:
由此可得出,头插法的顺序是反过来的,想要实现顺序的输出,就需要用到尾插法
尾插法:
顾名思义,尾插法是从尾巴插入,因此我们需要定义一个尾指针,通过尾指针来实现插入
插入:
注意:2跟3的操作不能相反,否则链表会生成出错
二次插入:
最后:
用代码实现:
#include <stdio.h>
#include <malloc.h>
typedef struct _Node {
int data; //数据域
struct Node* next; //指针域
} Node; //定义一个节点类型
int main() {
int i;
Node* headnode, * newnode, * last;
headnode = (Node*)malloc(sizeof(Node));//给头节点分配一个Node大小的内存空间使得指针可以指向节点的数据域跟指针域
headnode->next = NULL; //初始化头节点
last = headnode; //将头节点地址赋值给尾指针
printf("请输入数据\n");
for (i = 0; i < 3; i++) {
newnode = (Node*)malloc(sizeof(Node)); //给新节点分配一块内存空间
scanf("%d", &newnode->data); //给新节点输入数据
//尾插法
newnode->next = NULL; //链接头节点的NULL域
last->next = newnode; //通过尾指针来连接新节点
last = newnode; //将尾指针插入新节点,以方便第二次插入
}
Node* p;
p = (Node*)malloc(sizeof(Node));
p = headnode->next;
while (p != NULL) {
printf("%2d", p->data);
p = p->next;
}
}
最后代码输出:
因此,这种从尾部插入的方式,是比较符合我们使用的