C语言实现单链表(考研笔记)

概述

给需要考研的同学一个参考,单链表作为常见数据结构的一种,这里记录C语言实现单链表。

代码

函数原型和结构体声明

c 复制代码
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define true 1
#define false 0
#define bool char
//链表数据类型
typedef int ElementType;
//链表节点结构体
typedef struct LNode {
	ElementType data;
	struct LNode* next;

} LNode;
bool intLNode(LNode** head);
bool insertLNodeFromPos(LNode* head, int pos, ElementType data);
bool inserteEndLNodeFromTargetValue(LNode* head, ElementType target, ElementType data);
bool inserteBeforeLNodeFromTargetValue(LNode* head, ElementType target, ElementType data);
bool deleteFromPos(LNode* head, int pos);
//链表按值删除(带头节点)
bool deleteFromTargetValue(LNode* head, LNode* node);
LNode* query(LNode* head, ElementType target);

main函数

c 复制代码
int main() {
	LNode *head ;
	intLNode(&head);
	insertLNodeFromPos(head, 1, 1);
	insertLNodeFromPos(head, 2, 2);
	insertLNodeFromPos(head, 1, 101);
	inserteEndLNodeFromTargetValue(head, 2, 221);
	inserteBeforeLNodeFromTargetValue(head, 2, 333);
	//deleteFromPos(head, 3);
	deleteFromTargetValue(head, head->next->next->next);
	printf("%d",head->next->next->next->data);
	//printf("%d", query(head, 101)->data);
	return 0;
}

初始化(带头节点)

c 复制代码
 bool intLNode(LNode** head) {
	 *head = (LNode*)malloc(sizeof(LNode));
	 if (*head == NULL) {
		 return false;
	 }
	 (*head)->data = 0;
	 (*head)->next = NULL;
	 return true;
}

链表按位置插入(带头节点)

c 复制代码
 bool insertLNodeFromPos(LNode* head,int pos, ElementType data) {
	 //边界值判断
	 if (pos < 1) {
		 return false;
	 }
	 LNode* current = head;
	 int index = 0;
	 while (current!=NULL) {
		 if (index == pos - 1) {
			 break;
		}
		 current = current->next;
		 index++;
	}
	 //确保当前没有超出范围
	 if (current == NULL) {
		 return false;
	 }
	 //创建新节点
	 LNode* newNode = (LNode*)malloc(sizeof(LNode));
	 if (newNode == NULL) {
		 return false;
	 }
	 //更改指针指向
	 newNode->data = data;
	 
	 newNode->next = current->next;
	 current->next = newNode;
	 return true;
 }

链表按数据值后插入(带头节点)

c 复制代码
 bool inserteEndLNodeFromTargetValue(LNode* head, ElementType target, ElementType data) {
	 LNode* current = head;
	 while (current != NULL) {
		 if (current->data == target) {
			 break;
		 }
		 current = current->next;
	 }
	 //确保当前没有超出范围
	 if (current == NULL) {
		 return false;
	 }
	 //创建新节点
	 LNode* newNode = (LNode*)malloc(sizeof(LNode));
	 if (newNode == NULL) {
		 return false;
	 }
	 //更改指针指向
	 newNode->data = data;
	 newNode->next = current->next;
	 current->next = newNode;
	 return true;
 }

链表按数据值前插入(带头节点)

c 复制代码
 bool inserteBeforeLNodeFromTargetValue(LNode* head, ElementType target, ElementType data) {
	 LNode* current = head;
	 while (current != NULL) {
		 if (current->data == target) {
			 break;
		 }
		 current = current->next;
	 }
	 //确保当前没有超出范围
	 if (current == NULL) {
		 return false;
	 }
	 //创建新节点
	 LNode* newNode = (LNode*)malloc(sizeof(LNode));
	 if (newNode == NULL) {
		 return false;
	 }
	 //更改指针指向
	 newNode->data = current->data;
	 newNode->next = current->next;
	 current->next = newNode;
	 current->data = data;
	 return true;
 }

链表按位置删除(带头节点)

c 复制代码
 bool deleteFromPos(LNode* head, int pos) {
	 if (pos < 1) {
		 return false;
	 }
	 LNode* current = head;
	 int index = 0;
	 while (current != NULL) {
		 if (index==pos-1) {
			 break;
		 }
		 current = current->next;
		 index++;
	 }
	 //确保当前没有超出范围
	 if (current == NULL) {
		 return false;
	 }
	 //更改指针指向
	 LNode* temp = current->next;
	 current->next = current->next->next;
	 //释放断开节点的内存空间
	 free(temp);
	 return true;
 }

链表按指定节点删除(带头节点)

c 复制代码
 bool deleteFromTargetValue(LNode* head,LNode *node) {
	 LNode* current = head;
	 while (current != NULL) {
         //找到需要删除的节点的前一个节点
		 if (current->next == node) {
			 break;
		 }
		 current = current->next;
	 }
	 //确保当前没有超出范围
	 if (current == NULL) {
		 return false;
	 }
	 //更改指针指向
	 LNode* temp = current->next;
	 current->next = current->next->next;
	 free(temp);
	 return true;
 }

链表查找对应的节点

c 复制代码
 LNode* query(LNode* head, ElementType target) {
	 LNode* current = head;
	 while (current != NULL) {
		 if (current->data == target) {
			 break;
		 }
		 current = current->next;
	 }
	 //确保当前没有超出范围
	 if (current == NULL) {
		 return NULL;
	 }
	 return current;
 }
相关推荐
Master_Azur2 分钟前
java内部类与匿名内部类
后端
SuperEugene6 分钟前
Vue Router 实战规范:path/name/meta 配置 + 动态 / 嵌套路由,统一团队标准|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
开心就好20258 分钟前
不依赖 Mac 也能做 iOS 开发?跨设备开发流程
后端·ios
一只叫煤球的猫10 分钟前
RAG 如何落地?从原理解释到工程实现
人工智能·后端·ai编程
卷心菜投手ovo20 分钟前
一个页面支持自定义字段,后端该怎么设计数据库?
后端
小彭努力中23 分钟前
194.Vue3 + OpenLayers 实战:动态位置 + 高度 + 角度,模拟卫星地面覆盖范围
前端·css·vue.js·openlayers·animate
颜正义24 分钟前
作为前端你还不会 Playwright 进行单元测试吗?
前端·测试
隔壁家滴怪蜀黍25 分钟前
AgentScope MsgHub 多智能体通信机制详解
后端
孟陬25 分钟前
国外技术周刊 #3:“最差程序员”带动高效团队、不写代码的创业导师如何毁掉创新…
前端·后端·设计模式
张一凡9327 分钟前
easy-model -- "小而美"的React状态管理方案
前端·javascript·react.js