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;
}
热门推荐
人工智能培训机会如何提高就业竞争力
中国财政体制改革史:探索、变革与现代化之路
4S店合同违约金计算方式及毁约处理指南
5G核心技术大起底:微基站、毫米波等如何重塑通信格局
为何客制化键盘越来越便宜?从材料到技术全解析
三张图看懂汽车空调的组成及工作原理
美国心脏协会发布:改善心血管健康的饮食指南,10条建议如下
360度绩效考评如何收集反馈信息?
浅谈API生态建设:API安全策略的6项原则
房贷还清后需要去房管局办理解押手续
成长的土壤与阳光:家庭环境对孩子性格塑造的影响
罕见!李嘉诚"经理人"曝光最新动向,涉及股市!"庄股"重挫,背后发生了什么?
头晕可能是这4种病在“求救”,别不当回事!
“渔”字取名字寓意好吗女,渔字在女性命名中的含义
汽车定金合同违约纠纷怎么处理
比较艾曲泊帕、海曲泊帕和阿伐曲泊帕作用与安全性
医用酒精检测标准是什么?(2024最新版)
用户体验设计在UI设计中的关键作用:深化用户研究与测试,共创卓越产品体验
丝袜穿搭秘籍:这样穿让你美出新高度!
全屋Wi-Fi覆盖不求人:手把手教你打造智能家庭网络
绍兴兜率宫景区:会稽山上的佛教文化瑰宝
呼吸困难有时候要自己主动去深呼吸
手术前戒指摘不下了!海宁消防员病床前细心“破戒”
古代女子的挣扎与无奈,你知道多少?
太阳质量之谜:揭示太阳系的质量主宰!
热性水果有哪些?这些水果都有些什么营养和作用
如何建设电商团队
高岭之花清冷矜贵的男孩名字,比小说男主还耀眼!
15款游戏验证:i7 12700K与锐龙7 5800X 哪款CPU玩游戏更合适?
杠杆炒股是什么意思?投资者必知的基本概念