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;
}
热门推荐
探究pH对酶活性影响的实验创新
探索平方根计算:方法、定义与生活中的应用
设备维修的五个步骤
黄梅鱼面:鱼香绕舌不见鱼形,面感绵长非普通面条!
汽车减震器的常见故障及维修技巧
新项目怎么挤进奥运会?
抗血小板药物的作用机理及临床应用
选择不同饮食滋养不同肠道微生物群, 影响健康获益
清朝嫔妃的日常生活:宫墙内的独特节奏
黄金首饰纯度仪
《猜火车》如何用苏格兰文化塑造角色的身份认同?
急性心衰患者出现利尿剂抵抗,共识建议从这3方面优化襻利尿剂
虚拟主播:AI数字人在媒体行业的革新应用
乐健康|立春后“三层洋葱穿衣法”,15项春季养生要点一定要收藏!
轻松安装打印机的详细步骤与注意事项指南
超滤膜技术在印染废水处理中的应用与优势
赵英俊死因是什么?赵英俊什么原因走的?
塞翁失马焉知非福:从故事看人生智慧与哲理
我国职业教育层次结构的问题分析
美本「GPA要求」超全解读!你的成绩,能申请排名多少的大学?
第十四届广州国际干细胞与再生医学论坛在穗举办
牧野之战:以少胜多的军事思想解析
中国各大城市限号出行处罚标准全解析
幽幽子是什么意思
金中都城遗址公园打造“北京建都之始的全景博物馆”
盘式制动器的构造与工作原理
口角炎吃什么水果好得快
武汉至十堰、荆州可打“飞的” 湖北开通首批低空短途客运航线
保姆级二手车购买经验分享!把这些学会套路再深也不怕
干货 | 10种字体设计技巧直接抄!