C/C++数据结构---顺序表---链式存储结构2(不带头节点)

这篇具有很好参考价值的文章主要介绍了C/C++数据结构---顺序表---链式存储结构2(不带头节点)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 个人主页:仍有未知等待探索_数据结构,小项目,洛谷刷题-CSDN博客

专题分栏:数据结构_仍有未知等待探索的博客-CSDN博客 

前一篇链接:数据结构---顺序表---链式存储结构1(不带头节点)_仍有未知等待探索的博客-CSDN博客

目录

一、前言

二、链表的基本操作 

1.增加数据(增加节点)

1)思路

2)代码呈现

2.删除节点 

1)思路

 2)代码实现

3.改节点数据 

1)思路

2)代码实现 

4.查找数据 

1)思路

 2)代码实现

三、总结


一、前言

        根据上一篇的讲解,想必大家已经能够自己创建和初始化链表了。但是对于链表来说,这些操作还不能够完成一些功能,不足以把它应用到一些场景中。接下来还需要实现对链表的增、删、改、查等操作,来让链表能够更方便我们使用。这两次讲的链表才是最基础的单链表,接下来还有双向链表,循环链表等,再学这些之前要打牢基础。

        解释一个操作,问:为什么要给节点开辟空间以及什么时候应该开辟空间?(这也是我最近刚弄明白的,如果理解有误,请指出来,共同进步。)答:指针再内存中只占4/8字节(与电脑有关),指针只能存地址,所以指针里面没法存节点的数据域和指针域。所以需要开辟空间来给数据域和指针域存放数据。

二、链表的基本操作 

1.增加数据(增加节点)

1)思路

老样子我们先捋思路,怎么进行增加节点的操作呢?

首先要有一个链表(仅有头指针head也行),然后要有一个待插入的节点p和具体的位置。

C/C++数据结构---顺序表---链式存储结构2(不带头节点),数据结构,数据结构

当找到位置P的时候,还需要考虑是插在P位置的前面还是后面,最后就开始进行插入操作了。如何插入呢?当head为空的时候能不能正常的进行这个操作呢?

C/C++数据结构---顺序表---链式存储结构2(不带头节点),数据结构,数据结构

        将p节点插入如上链表中,无非就是上图所画的,把序号3黑线给断掉,然后把序号1和序号2的两条蓝线连上即可,(是不是head为空的时候也适用呢?等写代码的时候再来验证),那现在还有一个问题,是先连序号1的线还是序号2的线呢? 那就假如先连序号1的线,就需要把序号3的黑线断掉然后连上序号1的线,当想连序号2的线的时候,发现连不上,因为之前序号3指向的节点的地址找不着了。

        最后,根据推演,就先连序号2再连序号1.

2)代码呈现

List ListAdd(List head,int X,Position P)
{
	//前插
	List r = head,q;
	q = (List)malloc(sizeof(struct LNode));
	q->next = NULL;
	q->data = X;
	if (r == NULL)
	{
		r = q;
		return head;
	}
	while (r!=NULL)
	{
		if (r->next == P)
		{
			q->next = P;
			r->next = q;
			return head;
		}
		r = r->next;
	}
	return NULL;
}

        head为空的时候,对上述的步骤是没影响。但是上述代码中要寻找需要插入的位置,需要找到要插入位置的前一个节点,遍历的时候需要用到其指针域,如果head为空的话,head->next将越界,所以需要把head是否为空给讨论出来。 

        上面写的是再给出数据的前面插入数据,那如何后插呢?答:后插可以再前插的基础上把插入节点的数据和具体位置的节点的数据进行交换,是不是就相当于执行了后插操作呢。

2.删除节点 

1)思路

        删除节点,也需要一个具体的删除的位置,只要将要删除的前一个节点的指针域指向要删除的后一个节点是不是就相当于直接把要删除的节点给跳过去了,最后要注意的是用free函数把要删除的节点的空间给释放掉。

 2)代码实现

List ListDelete(List head, Position P)
{
	List r = head;
	if (r == NULL)
	{
		printf("链表为空,无需删除数据\n");
		return NULL;
	}
	while (r != NULL)
	{
		if (r->next == P)
		{
			if (P->next == NULL)//判断是否P为链表的最后一个
			{
				r->next = NULL;
			}
			else
			{
				r->next = P->next;
			}
			free(P);//释放P的空间
			return head;
		}
        r = r->next;
	}
	printf("未找到\n");
	return NULL;
}

3.改节点数据 

1)思路

该节点数据最主要的是找到节点,然后再该节点里面的数据。

2)代码实现 

List ListChange(List head, Position P)
{
	if (head == NULL)
	{
		printf("此链表为空\n");
		return NULL;
	}
	else
	{
		List r = head;
		while (r != NULL)
		{
			if (r == P)
			{
				int data;
				scanf("%d", &data);
				P->data = data;
				return head;
			}
			r = r->next;
		}
		printf("未找到\n");
		return NULL;
	}
}

这些功能都不算太难,只需要把每种情况都考虑全面了。

4.查找数据 

1)思路

遍历,然后一个一个把节点的数据与查找的数据相比,然后输出结果。

 2)代码实现

List ListSearch(List head, int data)
{
	List r = head;
	if (r == NULL)
	{
		printf("此为空链表,未找到\n");
		return NULL;
	}
	else
	{
		while (r->data == data)
		{
			printf("找到了\n");
			return r;
		}
		printf("未找到\n");
		return NULL;
	}
}

三、总结

这个代码的思路整体难度不高,主要是细不细心,把所有的情况都考虑全了。最后谢谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-727557.html

到了这里,关于C/C++数据结构---顺序表---链式存储结构2(不带头节点)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——单链表(不带头节点)

    链表是一种物理存储结构上非联系,非顺序的存储结构,但数据元素的逻辑顺序是通过链表中的指针链接实现的 逻辑结构: 实际物理结构: 每个链表节点都有自己的地址,链表的物理结构实际上是前一个结点保存着下一个结点的地址 所以从上面图中可以看出: 1.链表在逻辑

    2024年02月06日
    浏览(56)
  • 数据结构(顺序结构、链式结构、索引结构、散列结构)

    数据结构,就是一种程序设计优化的方法论,研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算, 目的是加快程序的执行速度、减少内存占用的空间 。 数据的逻辑结构指反映数据元素之间的逻辑关系,而与数据的存储无关,是独立于计算

    2024年02月03日
    浏览(82)
  • 数据结构——带头节点的双向循环列表

    带头节点的双向循环链表 是一种特殊的双向链表,它与普通的双向链表相比,最大的区别是链表头结点的 next 指针不再指向第一个实际节点,而是指向链表中的第一个节点。同时,链表尾结点的 prev 指针也不再指向 NULL,而是指向链表中的最后一个节点。 另外, 带头节点的

    2024年02月11日
    浏览(46)
  • 【脚踢数据结构】队列(顺序和链式)

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

    2024年02月12日
    浏览(38)
  • 7-数据结构-(带头节点)单链表的增删改查

    问题:          单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。 带头节点是为了使在空表时的操作更统一。如果不带头节点,空表插

    2024年02月14日
    浏览(52)
  • 数据结构之带头节点的单链表增删改查操作实现

            单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。       单链表的各个数据元素在物理上可以是离散存放的,每个结点除了存放数据元素外,还要存储指向下一个节点的指针。而顺序表是连续存放的,每个结点中只存放数据元

    2024年02月16日
    浏览(49)
  • 探索数据结构:顺序串与链式串的深入理解

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 串是一种特殊的 顺序表 ,即每一个元素都是单独一个 字符 。在C语言中我们学习的字符串便是串的一种,它在我们的数据搜索与文本编译中起着不

    2024年04月17日
    浏览(48)
  • 数据结构(4) 链表(链式存储)

    顺序表优点:可随机存取,存储密度高,缺点:要求大片连续空间,改变容量不方便。 单链表优点:不要求大片连续空间,改变容量方便,缺点:不可随机存取,要耗费一定空间存放指针。 定义单链表的代码: 定义数据领和指针域 定义一个新节点 定义typedef来缩短函数书写

    2024年02月22日
    浏览(42)
  • 【数据结构】二叉树的链式存储结构

    前序遍历,又叫先根遍历。 遍历顺序:根 - 左子树 - 右子树 代码: 中序遍历,又叫中根遍历。 遍历顺序:左子树 - 根 - 右子树 代码 : 后序遍历,又叫后根遍历。 遍历顺序:左子树 - 右子树 - 根 代码 : 除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍

    2024年02月09日
    浏览(45)
  • 数据结构---链式存储的线性表

    指针    定义:       指针也就是内存地址 ,指针变量是 用来存放内存地址 的 变量 ,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而 存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。 有了指针以后,可以对数据本身,也可以

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包