C语言链表操作详解:初始化、插入、头插、尾插与逆转
创作时间:
作者:
@小白创作中心
C语言链表操作详解:初始化、插入、头插、尾插与逆转
引用
CSDN
1.
https://blog.csdn.net/qq_63456518/article/details/136635573
链表是数据结构中一种常见的线性表,其特点是通过指针将数据元素链接在一起,形成一个链状结构。链表可以分为带头节点和不带头节点两种类型,每种类型在插入、删除等操作上都有其特点。本文将通过C语言代码示例,详细介绍链表的初始化、插入、头插、尾插以及逆转等基本操作。
#include <stdio.h>
#include <stdlib.h>
/**
* 1、链表初始化
* 2、插入链表
* 3、头插链表
* 4、打印链表(不带头节点)
* 5、打印链表(带头结点)
* 6、逆转链表(带头节点)
* 7、逆转链表(不带头节点)
*/
typedef int ElementType;
typedef struct Node * PtrToNode;
struct Node{
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
//初始化
void initList(List head){
head -> Next = NULL;
}
//插入链表
_Bool insertList(List head,ElementType e,int index){
if(index < 1) return 0;
while(--index){
head = head -> Next;
if(head == NULL) return 0;
}
//创建一个新节点
List list = malloc(sizeof(struct Node));
list -> Data = e;
list -> Next = head -> Next;
head -> Next = list;
return 1;
}
//头插链表
_Bool headInsertNode(List head,ElementType e){
List newNode = malloc(sizeof(struct Node));
if(newNode == NULL) return 0;
newNode -> Data = e;
newNode -> Next = head -> Next;
head -> Next = newNode;
return 1;
}
//尾插链表
_Bool rearInsertNode(List head,ElementType e){
List newNode = malloc(sizeof(struct Node));
if(newNode == NULL) return 0;
newNode -> Data = e;
newNode -> Next = NULL;
while(head -> Next){
head = head -> Next;
}
head -> Next = newNode;
return 1;
}
//打印链表(不带头节点)
void Print(List head){
while(head -> Next){
//头节点不存放数据,从第二个开始打印
head = head -> Next;
printf("%d ",head -> Data);
}
printf("\n");
}
//打印链表2(带头结点)
void Print2(List head){
while(head){
printf("%d ",head -> Data);
head = head -> Next;
}
printf("\n");
}
//逆转链表1
List Reverse1(List head){
// 创建一个指针存放新的头节点
List newHead = malloc(sizeof(struct Node));
initList(newHead); // 初始化新链表的头节点
head = head->Next; // 跳过头节点
while (head) {
List tmp = malloc(sizeof(struct Node)); // 创建一个新节点
tmp->Data = head->Data;
tmp->Next = newHead->Next;
newHead->Next = tmp;
head = head->Next;
}
return newHead;
}
//逆转链表2
List Reverse2(List head){
struct Node * newHead = NULL,*tmp;
head = head -> Next;
while(head != NULL){
tmp = head;
head = head -> Next;
tmp -> Next = newHead;
newHead = tmp;
}
return newHead;
}
int main(){
struct Node L1;
initList(&L1);
for(int i = 0; i < 10; i++){
insertList(&L1,(i+1)*10,i+1);
}
List L21,L22;
L21 = Reverse1(&L1);
L22 = Reverse2(&L1);
printf("初始链表:");
Print(&L1);
printf("逆转链表法1:打印逆转链表:");
Print(L21);
printf("逆转链表法2:打印逆转链表:");
Print2(L22);
//头插法插入链表
struct Node L3;
initList(&L3);
for(int i = 0; i < 10;i++){
headInsertNode(&L3,(i+1)*10);
}
//打印L3链表
printf("打印头插链表:");
Print(&L3);
headInsertNode(&L3,999);
printf("打印变化后的链表:");
Print(&L3);
//尾插发插入链表
struct Node L4;
initList(&L4);
for(int i = 0; i < 10;i++){
rearInsertNode(&L4,(i+1)*10);
}
printf("打印尾插链表:");
Print(&L4);
rearInsertNode(&L4,999);
printf("打印变化后的链表:");
Print(&L4);
//向链表输入n个数,然后头插链表L4,并打印出来该链表
int n;
printf("请输入n:\n");
scanf("%d",&n);
ElementType m;
printf("请输入n个数:\n");
for(int i = 0; i < n;i++){
scanf("%d",&m);
headInsertNode(&L4,m);
}
Print(&L4);
//向链表输入k个数,然后尾插链表L4,并打印出来该链表
int k;
printf("请输入k:\n");
scanf("%d",&k);
ElementType x;
printf("请输入k个数:\n");
for(int i = 0;i < k;i++){
scanf("%d",&x);
rearInsertNode(&L4,x);
}
Print(&L4);
return 0;
}
此外,还提供了一个简化的链表逆转函数:
List Reverse(List L) {
struct Node * newList = NULL,*tmp;
while(L != NULL){
tmp = L;
L = L -> Next;
tmp -> Next = newList;
newList = tmp;
}
return newList;
}
热门推荐
新手养兔子必读:十大必备用品清单
养短毛兔必看!新手也能变专家
Web3.0投票系统:用区块链守护你的每一票
对乙酰氨基酚vs布洛芬:感冒用药全解析
冬季感冒必备:鸡汤、燕麦和黄芪的完美搭配
北京同仁医院教你如何正确服用感冒药
黑米、黑豆、黑芝麻:三种黑色食材的养生大比拼
黑色食品真的更健康吗?
加油站安全高效加油指南:你真的做对了吗?
撬装加油站:河南陕西能源补给新选择
年夜饭创意装饰:让你秒变朋友圈焦点!
《努尔哈赤治国秘籍》:从草根到帝王的治国智慧
多尔衮:清朝入关的关键先生
看完新《红楼梦》,我得看老版四大名著洗洗眼
回归江湖,再述经典,《射雕英雄传》的戏里戏外好多魅力
如何选择优质股票并制定合理的选股策略?主力选股的依据有哪些?
时序效令:中国酒桌文化的精髓与现代应用
高情商应对领导敬酒,提升职场形象
如何选择适合的货币基金?这些基金有哪些优势和限制?
一口一个世界:啤酒文化的多彩魅力
法国鹅肝:美味还是残忍?
从鸡肝酱开始:法式美食制作入门
让今天的生活更美好的10个小行动
在家就能尝试的戒烟家庭疗法
定期更换食用油是否更健康?
年夜饭新花样:椒盐鸡块&青椒蒜子炒肉
什么是最优的投资理财选择?这种选择有什么依据?
理财低风险的内涵是什么?这种低风险有何优势?
华清池:一池温泉,千年故事
加拿大鹅与北极熊:一个物种繁盛,一个面临生存危机