C语言:链表(动态)创建之头插法和尾插法
1.头插法:特点:1.1每一次添加的新节点就是一个新的链表头。1.2数据的遍历是从输入的最后一个读起。#include <stdio.h>#include <stdlib.h>struct Link{int data;struct Link *next;};void printLink(struct Link* head){struct Link* p = head;whi
·
目录
1.链表的增删查需要注意的一些易错点:
链表增删查改超详细博客,还附带图画
https://www.cnblogs.com/yellowgg/p/8058857.html#top
尾插法(动态创建)--视频
https://www.bilibili.com/video/BV1x7411R7pt
头插法(动态创建)--视频
https://www.bilibili.com/video/BV157411Z7dc/?spm_id_from=333.788.recommend_more_video.-1
- 对于链表的使用,要时时刻刻注意头节点,如果头节点发生变化,返回的值错误,则链表会出错。
- 对于新节点的插入连接,连接顺序绝对不能乱。
- 删除节点,新增节点的话,则需要注意,是否有malloc开辟的空间被遗弃,有的话,要free掉。因为节点被遗弃成了无用节点后,内存中就多了它这个垃圾。
下面是从中间插入节点连接图:

2.头插法(动态):
特点:
1.1每一次添加的新节点就是一个新的链表头。
1.2数据的遍历是从输入的最后一个读起。
#include <stdio.h>
#include <stdlib.h>
struct Link
{
int data;
struct Link *next;
};
void printLink(struct Link* head)
{
struct Link* p = head;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
putchar('\n');
}
struct Link* insertFromHead(struct Link *head,struct Link *new) //真正的插入
{
if(head == NULL){
head = new;
return head;
}else{
new->next = head;
head = new;
}
return head;
}
struct Link* createLink(struct Link *head) //创建链表
{
struct Link *new = NULL;
while(1){
printf("input your new node data:\n");
new = (struct Link*)malloc(sizeof(struct Link));
scanf("%d",&(new->data));
if(new->data == 0){
printf("0 quit\n");
free(new); //如果第一次输入数据为0,则新节点new,malloc的空间没用,则free掉
return head;
}
head = insertFromHead(head,new);
}
}
int main()
{
struct Link *head = NULL;
head = createLink(head);
printLink(head); //打印链表
return 0;
}

3.尾插法(动态):
特点:
1.1要先遍历到最后一个,才接新节点。
1.2数据的遍历是从输入的第一个读起。
#include <stdio.h>
#include <stdlib.h>
struct Link
{
int data;
struct Link *next;
};
void printLink(struct Link* head)
{
struct Link* p = head;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
putchar('\n');
}
struct Link* insertFromBehind(struct Link *head,struct Link *new) //真正的插入
{
struct Link *p = head;
if(p == NULL){
head = new;
return head;
}
while(p! =NULL){
p = p->next;
}
p->next = new;
return head;
}
struct Link* createLink(struct Link *head) //创建链表
{
struct Link *new = NULL;
while(1){
printf("input your new node data:\n");
new = (struct Link*)malloc(sizeof(struct Link));
scanf("%d",&(new->data));
if(new->data == 0){
printf("0 quit\n");
free(new); //如果第一次输入数据为0,则新节点new,malloc的空间没用,则free掉
return head;
}
head = insertFromBehind(head,new);
}
}
int main()
{
struct Link *head = NULL;
head = createLink(head);
printLink(head); //打印链表
return 0;
}

更多推荐

所有评论(0)