C语言数据结构创建单链表,插入操作,删除操作,存取操作,查找操作的代码实现

单链表上基本操作实现——建立插入查找删除,表长。 本文是对单链表的基本操作学习——包括单链表建立删除插入查找,等等操作。有些操作好将带头结点单链表不带头结点单链表均都实现代码复现!值得一看! 阅读详情

一、概述

      单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。一个单链表结点由以下两个域构成。

数据域指针域
datanext

      其中数据域data存放该结点的数据域的值,指针域存放该结点的后继结点的地址信息。
      如果想要去跑下面代码的实现,请先加上头文件和结构体声明以及全局变量,这里也附带了一个测试用的主函数。

#include<stdio.h>
#include<stdlib.h>

// 结构体所需的内存空间
#define LEN sizeof(struct Node)
// 输入错误时的返回值
#define ERROR_INPUT -1

// 定义单链表的结构体,存放数据域和指针域
struct Node
{
	int    data;
	struct Node *next;

};

// 结点的总数
int N;

// 函数声明
struct Node *create();
void print(struct Node *head);
int insert(int k, int data, struct Node *head);
int delete(int k, struct Node *head);
int find(int k, struct Node *head);
int search(int item, struct Node *head);

int main()
{
	struct Node *p;

	p = (struct Node*)malloc(LEN);
	// 测试
	p = create();
	insert(1, 22, p);
	delete(3, p);
	printf("%d\n",find(2, p));
	printf("%d\n",search(3, p));
	print(p);
	return 0;
}

// 创建一个单链表,返回头指针
struct Node *create()
{
	struct Node *head;
	struct Node *p1;
	struct Node *p2;

	N	= 0;
	p1	= (struct Node*)malloc(LEN);
	
	// 当输入的最后一个值为0时结束
	printf("请依次输入每个结点的数据域的值,输入0结束\n");
	scanf("%d", &p1->data);
	head	= NULL;
	while (p1->data != 0) {
		N = N + 1;
		if (N == 1) {
			head = p1;
		} else {
			p2->next = p1;
		}
		p2 = p1;
		p1 = (struct Node*)malloc(LEN);
		scanf("%d", &p1->data);
	}
	// 最后一个结点的next存NULL
	p2->next = NULL;
	return head;
}

二、单链表的操作

      下面是关于单链表的基本操作,在进行这些操作前,请先添加概述里面的代码,并按需调整。其中插入,删除,存取,查找等操作需要建立在创建单链表的操作之下,才可实现。最后的遍历输出单链表所有结点的数据域是将当前的列表的所有结点值打印出来的一个可视化的操作。

1. 创建单链表

// 使用动态列表的方法创建并初始化一个单链表,返回头指针
struct Node *create()
{
	struct Node *head;
	struct Node *p1;
	struct Node *p2;

	N	= 0;
	p1	= (struct Node*)malloc(LEN);
	
	// 当输入的最后一个值为0时结束
	printf("请依次输入每个结点的数据域的值,输入0结束\n");
	scanf("%d", &p1->data);
	head	= NULL;
	while (p1->data != 0) {
		N = N + 1;
		if (N == 1) {
			head = p1;
		} else {
			p2->next = p1;
		}
		p2 = p1;
		p1 = (struct Node*)malloc(LEN);
		scanf("%d", &p1->data);
	}
	// 最后一个结点的next存NULL
	p2->next = NULL;
	return head;
}

2. 插入操作

// 第k个结点后插入数据域为data的结点
int insert(int k, int data, struct Node *head)
{
	struct 	Node *p;
	struct	Node *s;
	int 	i;

	// 初始化
	s = (struct Node*)malloc(LEN);
	p = head;
	i = 0;

	// k是否合法
	if (k < 0) {
		printf("插入不合法\n");
		return ERROR_INPUT;
	}

	// p指向第k个结点
	while (p != NULL && i < k-1) {
		p = p->next;
		i++;
	}

	// 插入
	s->data = data;
	s->next = p->next;
	p->next = s;

	// 更新节点总数
	N++;
}

3. 删除操作

// 删除链表中的第k个结点
int delete(int k, struct Node *head)
{
	struct Node *p;
	struct Node *q;
	int i;

	p = head;
	i = 1;

	if (k < 1) {
		printf("删除不合法\n");
		return ERROR_INPUT;
	}

	// 找第k-1个结点
	while (p->next != NULL && i < k-1) {
		p = p->next;
		i++;
		if (p->next == NULL) {
			printf("无此结点\n");
			return ERROR_INPUT;
		}
	}

	// 删除第k个结点
	q = p->next;
	p->next = q->next;
	// 释放指针q指向的内存空间
	free(q);
	q = NULL;

	//更新结点总数
	N--;
}

4. 存取操作

// 将链表中的第k个结点的数据域的值赋给item
int find(int k, struct Node *head)
{
	struct Node *p;
	int item;
	int i;

	i = 1;
	// k合法?
	if (k < 1) {
		printf("存取位置不合法\n");
		return ERROR_INPUT;
	}

	//找第k个结点
	p = head;
	while (p != NULL && i < k) {
		p = p->next;
		i++;
		if (p == NULL) {
			printf("无此结点\n");
			return ERROR_INPUT;
		}
	}

	// 存值并返回
	item = p->data;
	return item;
}

5. 查找操作

// 在链表中查找数据域为item的结点并返回其在表中的位置
int search(int item, struct Node *head)
{
	struct Node *p;
	int i;

	p = head;
	i = 1;

	// 逐点访问
	while (p != NULL && p->data != item) {
		p = p->next;
		i++;
	}

	if (p != NULL) {
		return i;
	} else {
		printf("无此结点\n");
		return ERROR_INPUT;
	}

6. 遍历输出单链表的所有结点数据域

// 遍历所有结点并输出其数据域的值
void print(struct Node *head)
{
	struct Node *p;

	printf("Total number of nodes is:%d\n", N);

	p = head;
	if (head != NULL) {
		do {
			printf("%d ", p->data);
			p = p->next;
		} while (p != NULL);
	}
	printf("\n");
}

三、总结

      下图是上述代码的运行结果,编译环境为linux,但在dev中也可正常运行,在Visual Studio中调整一下也可运行。图中的输入输出由前面的概括中的主函数决定。

第1行为提示初始单链表
第2行为初始化单链表
第3,4行为遍历输出当前的单链表(在第1个结点后插入22)
第5,6行为遍历输出当前的单链表(删除第三个结点)
第7行为存取链表中第二个结点,并将其值输出
第8行为在链表中查找数据域为3的结点并返回其在表中的位置
最后一行也为遍历输出当前的单链表运行结果

      最后,很高兴你看到了这里,并且对上述代码进行了自己的研究,有了自己的收获。对了,还有不要忘记点赞噢。附上我喜欢的一句话,与君共勉。
      走过的路,看过的风景,都是我们的底蕴,或许多学一点,对同一件事的看法就会不一样。

c语言单链表实现(一) 创建插入删除查找 #include #include #include #define NULL 0 #define LEN sizeof(struct Student) using namespace std; typedef struct Student { int length; int num; struct Student *next; }Student; typedef Student *Lin 阅读详情

相关推荐

线性表的链式存储结构——链表及其操作(创建,查找,插入,输出,删除)

文章目录1.单链表建立1.1头插法1.2尾插法2.链表基本操作 1.单链表建立 1.1头插法 1)从一个空表开始,创建一个头结点。 2)依次读取数组a中的元素,生成新节点。 3)将新节点插入到当前链表的表头上,直到结束为止,插入过程如下图所示。 typedef struct LNode { int data; struct LNode *next;//存储后继节点位置的指针域,用next表示 }LinkNode; 头插法代码如下,由数组元素a创建单链表L void CreatListF(Lin

striver的博客 1万+

单链表——基本操作(求表长、查找插入删除)(java)

public class LinkedList { public Node first;//定义头结点 public LinkedList(){ this.first=null; } //定义节点类 public class Node{ int data; Node next=null; public Node(int data){ this.data=

IFollowRivers 2704

电机FOC控制实战:STM32 CubeMX配置六路互补PWM与死区优化

本文详细介绍了如何使用STM32 CubeMX配置六路互补PWM与死区优化,实现电机FOC控制。通过实战经验分享,包括时钟配置、定时器设置、死区时间计算及优化技巧,帮助开发者避免常见问题,提升电机控制性能。特别适用于STM32G4系列的无刷电机驱动应用。

weixin_29193259的博客 377

单链表创建插入删除查找、遍历等功能(C语言实现

下面展示一些 内联代码片。 //用到的头文件、结构体 #include <stdio.h> #include <stdlib.h> typedef int elemtype; typedef struct node { elemtype data; struct node *next; }LinkList; int i;//记录链表节点的个数(除头结点) //头插法创建链表 LinkList *creat_LinkListF() { i = 0;

weixin_46626833的博客 4909

数据结构之线性表

数据结构模块化 创建三个文件分别为:XXX.h的头文件(用于定义以及运算) XXX.c文件用于头文件运算的实现 test.c测试文件或项目文件引用自己写的头文件 这样做的好处为: 1、结构层次更为明显,简练。 2、给别人的时候可以直接给生成的.o文件,不给其他文件它只能运行,不能修改或其它操作。保护自己知识产权。 3,可以给其他人或文件调用 线性表按存储结构分为顺序表以及单链表 一、顺序表 malloc一片固定大小存储空间连续的一段空间(像定义一维数组一样) 利用last去定位每一个数据 sqlist.h

wzf_Cql 482

C语言实现单链表创建删除查找插入

本文将详细的介绍C语言单链表创建删除查找插入以及输出功能一、创建#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; typedef int ElemType; /*结构体部分*/ typedef struct Node { ElemType data; //数值域 struct Node *next; //指针域 }Li...

qq_36806987的博客 3万+

单链表创建插入删除以及查找

链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列结点组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数方法。

Lookdrama的博客 4万+

C语言数据结构 单链表建立、遍历、查找插入删除操作

链表(Linked List)是一种物理存储单元上非连续、非顺序的数据结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(node,链表中每一个元素称为结点)组成,每一次为一个结构体 动态分配的内存空间,可称之为一个结点,每个结点之间可以是不连续的,但结点内是连续的。结点个数是不受限定的,可以随时删改,这是与数组相比的优点。.........

追求。 1万+

C语言实现单链表创建及基本操作

C语言实现单链表创建及基本操作 往期文章:C语言实现顺序表的创建及基本操作 这次主要是分享一下数据结构单链表创建及基本操作,这一部分也是属于比较基础的内容。但是越基础的东西我们越要投入精力去学习,不能眼高手低。我在编写这一部分的内容时就出现了许多错误,这也算是一次查漏补缺的博客吧,下面我们正式开始。 单链表的结构定义 首先我们先来看一下常规定义的单链表,一般情况下会包含数据域指针域。例...

weixin_43954729的博客 4万+

C语言单链表创建插入删除,遍历

C语言单链表创建插入删除,遍历 首先需要创建链表结点结构 在这里插入代码创建链表 在这里插入代码

前行者的博客 1万+

数据结构C语言 单链表插入删除查找

数据结构C语言 单链表插入删除查找) 1、插入 假设_A_的临时指针为 “p” ,C_的临时指针为 “q“。 步骤1: _ 删除这条连接线; 步骤2: 将p->next给q->next; 步骤3: 将q给p->next; 插入代码 q->next = p->next; p->next = q; 2、删除 假设_A_的临时指针为 “p” ,_B_的临时指针为 “q“。 步骤1: 删除这条连接线; 步骤2: 删除这条连接线; 步骤3: 将p->next给q,接着

更多资料私我 7491

数据结构-单链表基本操作-C语言代码

单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法建立单链表 #include<stdio.h> #include<stdlib.h> //单链表的结构定义 typedef struct LNode { int data...

suxiaorui的博客 6万+

数据结构-C语言】>根据给定的整型数组,以尾插法建立一个单链表,并实现查找删除插入操作

#include<stdio.h> #include<malloc.h> #include<stdbool.h> #include<stdlib.h> typedef struct Node{ //单链表 int data; //结点自身信息 struct Node *next; //后继结点的指针 ...

桺柒郞的小小屋 5545

数据结构(C语言版)实现单链表创建,赋值随机数,插入删除,取值,输出

数据结构(C语言版)实现单链表创建,赋值随机数,插入删除,取值,输出 定义一个结构体类型 typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; 创建L头结点,L当列表 Status InitList(LinkList &L){ L=new LNode; L->next =NULL; } 获取在L列表中第i个结点的存的数据 Status GetElem(LinkList &

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 4924

线性表链式存储-初始化、插入删除查找、读取操作(C语言

一、单链表抽象数据类型定义: #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #define OK 1 #define ERROR 0 typedef int Elemtype;//数据类型重定义 typedef int Status;//状态类型重定义 typedef struct LNode{ Elemtyp...

苍之羽 1万+

数据结构单链表的增删查改(C语言实现

单链表的增删查改操作(C语言实现)。

在平淡的日子里寻找存在的价值 5220

数据结构-链表操作创建、输出、查找插入删除等) C语言源码

数据结构-链表操作创建、输出、查找插入删除等) C语言源码 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; typedef char datatype; typedef struct node { datatype data; struct node *next; }linklist; linklist *head,*p; /...

springhammer的博客 4406

数据结构】C语言实现单链表的基本操作

数据结构】第二章——线性表(6) 详细介绍了通过C语言实现单链表的基本操作……

蒙奇D索大的博客 2653

用C语言创建单链表实现插入删除等简单操作

单链表比起顺序表来说存储更灵活,在需要进行频繁的插入删除操作的情况下,使用单链表操作更加简单。但是在需要查找元素,计算链表长度时又会显得比较麻烦。选择顺序表还是单链表是要依情况而定。 创建单链表(头插法): 头插法:始终让每个新结点放在链表中第一个位置,这样导致的结果是:当我们对链表进行遍历时,先遍历的是最后加入链表的结点。(下面给出的代码先不给新结点的数据域赋值,尾插法也是) void CreateListHead( LinkList *L , int length ) { int i ;

HXZ_CREATE的博客 5763
下一篇: C语言数据结构创建链式队列,插入操作,删除操作,存取操作的代码实现
ling_fuღ
博客等级 码龄4年 145粉丝 2原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值