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

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

个人主页:

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

专题分栏---数据结构:

数据结构_仍有未知等待探索的博客-CSDN博客

目录

一、引例

1.顺序存储结构

2.链式存储结构

二、链表的创建和初始化

1.链表创建的分析

1)头插法

过程:

代码的实现:

2)尾插法

过程+代码实现:

三、未完待续 。。。


今天,我们来讲解顺序表的链式存储结构。在讲解顺序表的链式存储结构的之前,我们要先讲讲问什么要引入链式存储结构。

一、引例

顺序存储的优点                链式存储的优点
1.容易读取数据 1.节省空间
2.创建和初始化简单 2.插入和删除元素简单

1.顺序结构在物理层面上相邻,在逻辑层面上也是相邻的。

2.链式结构在物理层面上不相邻,在逻辑层面上是相邻的。

通过上述对不同的存储结构的优点的描述,我们也明白了在什么情况下用什么存储结构来实现我们的功能。

1.顺序存储结构

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

顺序存储结构就会像这样一样,将数据存在数组中。 会在内存中开辟一块连续的空间,然后将数组存在上面的数组中,然后再用一个变量来存储最后一个元素的下标。

2.链式存储结构

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

链式存储结构像上述一样,会开辟一个个的节点,每个节点有数据域和指针域,数据域会存放数据而指针域则是存放下一个节点的地址,来方便找下一个节点。链式存储结构就是像图片画的一样,再内存的随机地方开辟一个空间来作为节点,这样避免的了内存空间的浪费,用多少就开辟多少空间,灵活度高。 

二、链表的创建和初始化

1.链表创建的分析

链表是什么连上的呢?

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

一开始,先创建一个节点,让一个head指针指向这个节点,然后再创建一个节点,就会产生一个分歧,那是将新创建的节点再逻辑层面上放在head所指向的左边还是右边呢?那就会分成两个创建链表的方法---头插法,尾插法

1)头插法

头插法就是在逻辑层面上最先开辟的节点放在最右边。

过程:

先创建一个节点,然后用head指针(也就是头指针)指向这个节点。然后再开辟一个节点,让这个节点的指针域存放head指针指向的节点的地址,然后让head指向这个新开辟的节点。

注:红色的是第一步,蓝色的是第二步。

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

代码的实现:

在代码实现的前面,你要知道节点的类型是什么,节点里面包含数据域和指针,这是两个类型的数据,怎么将这两个数据合在一块呢?

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

像这样就可以将两个数据类型合成为一个数据类型。 这里的typedef/用来将这个节点类型struct Node重命名为Node。

然后准备工作就做完了,接下来就开始链表的创建。

Node* ListCreate1(Node* L)
{
	int data;
	scanf("%d", &data);
	Node* head=NULL, * p;
	//data为0结束
	while (data)
	{
        //开辟空间
		p = (Node*)malloc(sizeof(Node));
		//赋值
        p->data = data;
		//将head里的地址赋值到开辟的节点的指针域
        p->next = head;
		//然后将head(头指针)指向第一个节点
        head = p;
		scanf("%d", &data);
	}
	return head;
}

输入数据:

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

链表:

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

从上面也能清楚的看出来,数据正着输入,逆序存储,这也是头插法的特点。 

2)尾插法

过程+代码实现:

这个尾插,需要用到三个指针head,q,p来进行循环完成操作。同样,先创建一个节点,然后让head指针指向这个节点,让q也指向这个节点。

尾插法的创建需要进行讨论。q就相当于一个尾指针。

当head==NULL的时候,你需要让head=p;q=p;

if (head == NULL)
{
	head = p;
    q=p;
}

 当head!=NULL的时候让q->next=p;q =p;

if(head!=NULL)
{
    q->next = p;
    q=p;
}

最后进行合并一下就行了。 

Node* ListCreate2(Node* L)
{
	int data;
	scanf("%d", &data);
	Node* head=NULL, * p, * q=NULL;
	while (data)
	{
		//data输入0的时候结束
		p = (Node*)malloc(sizeof(Node));
		p->data = data;
		if (head == NULL)
		{
			head = p;
		}
		else
		{
			q->next = p;
		}
		q = p;
        q->next=NULL;
		scanf("%d", &data);
	}
	return head;
}

输入数据:

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

链表:

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

从上面能清晰的看见链表是正着输入,正着存储的

三、总代码(声明+定义)

#include<stdio.h>
#include<stdlib.h>
//创建一个节点类型,typedef用来将这个节点类型struct Node重命名为Node
typedef struct Node
{
	int data;
	struct Node* next;
}Node;
Node* ListCreate1(Node* L);
Node* ListCreate2(Node* L);
Node* L1,L2;
int main()
{
	L1=ListCreate1(L);
	L2=ListCreate2(L);
	return 0;
}
Node* ListCreate1(Node* L)
{
	int data;
	scanf("%d", &data);
	Node* head=NULL, * p;
	//data为0结束
	while (data)
	{
		p = (Node*)malloc(sizeof(Node));
		p->data = data;
		p->next = head;
		head = p;
		scanf("%d", &data);
	}
	return head;
}
Node* ListCreate2(Node* L)
{
	int data;
	scanf("%d", &data);
	Node* head=NULL, * p, * q=NULL;
	while (data)
	{
		//data输入0的时候结束
		p = (Node*)malloc(sizeof(Node));
		p->data = data;
		if (head == NULL)
		{
			head = p;
		}
		else
		{
			q->next = p;
		}
		q = p;
		q->next = NULL;
		scanf("%d", &data);
	}
	return head;
}

四、未完待续 。。。

谢谢大家的支持!!!文章来源地址https://www.toymoban.com/news/detail-726977.html

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月15日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包