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;
}
热门推荐
签订了无固定期限劳动合同,公司辞退要支付多少赔偿金?
驼背可能带来的五大健康隐患
全球和平指数排名:非洲哪些国家最安全?
为什么杭州300多家百姓健身房,有的收费、有的免费?谁在光顾这类健身房?
U型布局:制造业生产线布局的优化方案
在派出所值班打不破的"魔咒"
模具开裂的主要原因分析及对策
叶绿素的组成元素及其主要吸收的光
ige检查在过敏诊断中的作用与意义
电信VS移动:谁的网络更胜一筹?深度剖析网络优劣,助你明智选择!
一文读懂 AI 大模型备案:万字详解全流程要点
C++:动态多态(虚函数+继承)
如何证明老人不是完全行为能力人
仓库管理系统(WMS):一文扫盲,仓库运转效率提升的必备。
头层牛皮与二层牛皮:材质对比与选购指南
遭遇暴力伤害、交通事故和酒驾被撞后的处理方法
孕妇吃辣条对胎儿有影响吗
孕妇吃辣条对胎儿有影响吗
劳务派遣年龄限制:如何确保合法合规?
韶关改名的原因,你肯定不知道!
心肌缺血是什么意思
手写发票可不可以涂改
海南特岗教师职业发展路径与多元出路解析
多路输出开关电源的应用注意事项
Excel中进行方差分析的多种方法详解
铜锵铜锵锵的背景和象征意义是什么-它背后有哪些深刻的文化含义
糖尿病不要紧?这4种急性并发症,来势汹汹,分分钟致命
武汉光谷CBC地块规划变更:期待与落空的边缘游走
房屋中介违法举报指南:范围、方式与法律依据
网络盒子处理器天梯图:选型指南与性能解析