手把手教你怎么写顺序表

这篇具有很好参考价值的文章主要介绍了手把手教你怎么写顺序表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、顺序表有什么功能?

二、实现顺序表的各个功能

1.前置准备

2.初始化顺序表

3.顺序表扩容

4.打印顺序表

5.增加顺序表成员

5.1尾增

5.2头增

 6.删除顺序表中成员的内容

6.1尾删

6.2头删

 7.查找成员

 8.修改(替换)

9.插入(在目标位置插入成员)

10.定向删除(将目标位置的成员删除)

三、全部代码

1.函数头文件

2.函数实现


一、顺序表有什么功能?

这就像是大纲一样,只要我们明确了要实现的功能,之后就是努力地实现它们就好了,众所周知,顺序表是在计算机内存中以数组的形式保存我们需要的数据。既然数据被保存了,那么我们接下来就是对这些保存好的数据进行对应的操作,增删改查是必须要有的,接着,我们想将顺序表中的内容打印出来,看看到底有没有正确的存储我们需要的数据,我们可以再设计一个打印函数,想对顺序表的内容排序也可以再设计一个排序函数,反正根据自己所需设计,但是增删改查是最基本的,必须要有的。

二、实现顺序表的各个功能

1.前置准备

在实现顺序表的各个功能之前我们得先有点前置准备内容,顺序表的成员类型,顺序表这个结构体的设计,头文件的引用......这些操作笔者推荐都放在一个头文件中进行,这样在调用的时候仅需引用一个头文件即可完成我们需要的功能。

// SeqList.h
//将所需函数和所需头文件的引用放在一个头文件中,那么在使用的时候就只用引用一个头文件
#pragma once//防止头文件被重复引用
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>//可能要用到的头文件
typedef int SlDateType;
//将int typedef成SlDateType这样就可以区分int和顺序表成员
// 虽然它们的类型本质上都是int但是它们的字面含义已经不同
//当然了,可以把int换成别的类型
//这样子设计其实更多的是为了到时顺序表成员类型想更换直接从这换就全换了,不用一个一个换
typedef struct seqlist
{
	SlDateType* a;
	//创建一个指针类型的顺序表成员数据,为什么是指针?
	//这样做是为了到时能够使用malloc和realloc对空间的大小进行开辟与修改
	//相当于柔性数组
	int sz;//已经存放了多少个成员
	int capacity;//容量大小,以后判定空间是否够用可以通过这个来判定
}seqlist;//将结构体名字命名为seqlist,使用时更加方便

2.初始化顺序表

记得在书写代码之前将之前的顺序表头文件引用进来,这样就可以用到顺序表头文件的内容。

//顺序表.c
#include"顺序表.h"
void init_seqlist(seqlist* s1)//通过指针的形式访问,便能够对内容进行修改
{
	s1->capacity = 3;//将容量大小初始化为3,为了更好地测试到时的扩容效果
	s1->sz = 0;//将成员数量初始化为0,代表着此时没有存放成员
	s1->a = (SlDateType*)malloc(sizeof(SlDateType) * s1->capacity);
	//将顺序表的成员数组大小初始化和容量一样的大小
	if (s1->a == NULL)//开辟失败的话直接退出程序
	{
		exit(-1);
	}
}

在顺序表.c中书写完函数的内容后别忘了在顺序表.h中引用它,这样别人才能够只引用一个头文件就能够使用对应函数。

3.顺序表扩容

在存放顺序表成员之前我们应该要注意的一点就是,我们的容量是有限的,那么在触及容量的时候,也就是顺序表已经被装满的时候,我们应该要扩容处理,避免出现装不下内容的情况出现。

void if_enough(seqlist* s1)
{
	if (s1->sz == s1->capacity)
	//当容量和成员个数相当时,显然就已经存满了,需要扩容
	{
		s1->a = realloc(s1->a,sizeof(SlDateType)*s1->capacity*2);
		//将容量扩大到原来容量的两倍
		if (s1->a == NULL)
		{
			perror("if_enough");//错误提示
			return;//中止程序
		}
		s1->capacity *= 2;//扩容成功,容量翻倍
		printf("扩容成功,当前容量为%d\n",s1->capacity);//扩容成功给个提示
	}
}

4.打印顺序表

在增加之前,我们就会意识到这样一个问题,倘若我增加了顺序表成员,但我又该如何分辨出我成功增加了顺序表成员呢,听着是不是很绕?其实就是我们不能够直接的看到顺序表的内容,因此我们可以使用打印的方式将顺序表的内容打印出来。

void print_seqlist(const seqlist* s1)
//将内容打印出来,但内容是不会被改变的,因此用const修饰,避免内容被修改
{
	if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 0; i < s1->sz; i++)
	{
		printf("%d ", s1->a[i]);//将内容通过循环的方式打印出来
	}
	printf("\n");//打印完所有内容之后最好换行
}

5.增加顺序表成员

5.1尾增

什么是尾增?顾名思义,就是从最后面开始增加,即在顺序表的最后进行成员的添加,注意:在进行增加之前我们需要判断顺序表是否被放满,这个时候就可以使用我们之前创建的if_enough函数来判断是否需要进行扩容处理,如果需要则扩容,不需要则无事发生。

void seqlist_pushback(seqlist*s1,SlDateType x)
{
	if_enough(s1);
	s1->a[s1->sz] = x;//在顺序表的最后插入一个数据x
	s1->sz++;
}

创建一个新的文件,测试一下我们之前写的代码 

//test.c
#include"顺序表.h"
int main()
{
	seqlist s1;
	init_seqlist(&s1);//初始化顺序表
	print_seqlist(&s1);
	//将顺序表内容打印,但此时是空,故不能打印
	seqlist_pushback(&s1, 1);//依次将1,2,3放入顺序表中
	seqlist_pushback(&s1, 2);
	seqlist_pushback(&s1, 3);
	print_seqlist(&s1);//打印顺序表
	seqlist_pushback(&s1, 2);//依次将2,3放入顺序表中
	seqlist_pushback(&s1, 3);
	print_seqlist(&s1);//打印顺序表
}

手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

5.2头增

顾名思义,在顺序表的最开始进行成员的增加,我们不难想象,若是这个顺序表中已经有成员了这么办?难不成直接将这个成员替换成我们的目标?如果这样做就会少一个成员,根据数组的经验,我们只能够通过覆盖的方式先将所有的成员往后挪一个单位,再将最前面的成员替换成我们需要的成员。同样在开始之前我们应该要判断容量是否足够。

这里挪动是核心,同样也是一门学问,笔者在这画副图给大家,大家就懂得如何挪动了手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++ 由图可知,我们要先将最后面的成员往后挪动到下一个空间中,也就是sz对应的空间内容,得是sz-1的空间内容,sz-1的内容得是sz-2的内容,那么就可以通过循环的方式实现,sz-i指向的内容等于sz-i-1指向的内容,i实现一步步的覆盖,这里面比较难想的就是i的范围,由目标分析可知,当sz-i-1=0的时候结束循环,为什么?,因为当sz-i-1=0的时候,sz-i等于1,也就是1对应的目标,等于0对应的目标,完成这一步之后,所有的覆盖就已经结束,根据计算可知,i=sz-1,故i<sz便可以实现所有的覆盖。

void seqlist_pushfront(seqlist* s1, SlDateType x)
{
	if_enough(s1);
	int i = 0;
	for (i=0;i<s1->sz;i++)//通过循环从后往前覆盖
	{
		s1->a[s1->sz - i] = s1->a[s1->sz-i-1];
	}
	s1->a[0] = x;//将首元素替换成x
	s1->sz++;
}

 同样可以测试一下

//test.c
#include"顺序表.h"
int main()
{
	seqlist s1;
	init_seqlist(&s1);//初始化顺序表
	print_seqlist(&s1);
	//将顺序表内容打印,但此时是空,故不能打印
	seqlist_pushback(&s1, 1);//依次将1,2,3放入顺序表中
	seqlist_pushback(&s1, 2);
	seqlist_pushback(&s1, 3);
	print_seqlist(&s1);//打印顺序表
	seqlist_pushfront(&s1,520);//在最前面放入520
	print_seqlist(&s1);//打印顺序表
}

手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

 6.删除顺序表中成员的内容

6.1尾删

这个就很简单了,我们只需要将此时顺序表的成员数量往回拨一位就行。为什么?举个例子,成员中已经有了1,2,3,4,5那么不难得出sz此时是5,指向的是5后面的空间,而当我们把数量往回拨的话,sz就指向了4,那么此时sz就指向了5对应的空间,下次你在再增加内容的时候这个空间就会被自动覆盖掉,同样,打印的话也是根据sz来打印的,会直接略过。唯一需要注意的一点就是,当顺序表的成员为空的时候,也就是没有成员的时候,强行删除的话就会造成越界问题的发生。因为没有成员的时候,sz为0,你对它强行进行删除,那么就会导致sz=-1,下一次再增加元素的时候,就会越界访问。

void seqlist_popback(seqlist* s1)
{
	if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	s1->sz--;
}

6.2头删

头删相对于尾删麻烦一些,我们通过从前往后覆盖的方式将前面的内容覆盖成后面的内容

void seqlist_popfront(seqlist* s1)
{
	if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 1; i < s1->sz; i++)
	{
		s1->a[i-1] = s1->a[i];//从前往后覆盖
	}
	s1->sz--;
}

同样,我们可以测试一下 

手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

 7.查找成员

目标很简单,就是查找到目标成员然后打印出来,找不到就打印找不到,通过一次遍历就可以搞定

void seqlist_fine(const seqlist* s1,const SlDateType x)
//查找的目标是x,用const修饰是因为只是查找,不用修改
{
	if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 0;i<s1->sz; i++)
	{
		if (s1->a[i] == x)//相等意味着找到了
		{
			printf("找到%d了,下标为%d\n",x,i);
			return;
		}
	}
	printf("目标不存在\n");
}

同样可以测试一下 

手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

 8.修改(替换)

给对应的下标,和被修改的结果,对目标下标的内容进行修改,要注意的是,我们修改下标的范围只能是在成员组中进行修改,什么意思?就是说,我们不能对还没放成员的下标进行修改

void seqlist_modify(seqlist* s1, int pos, const SlDateType x)
{
	if (pos >= s1->sz)
	//当pos=sz时就已经是对还不是成员的空间进行操作了,更别说后面的了
	{
		printf("当前空间还不是成员的一部分,操作失败\n");
		return;
	}
	s1->a[pos] = x;
}

同样可以测试一下手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

9.插入(在目标位置插入成员)

需要注意的便是,我们插入的范围是多少,很显然0~sz-1都是可以插入的,这里面已经是有内容的了,那么sz可不可以呢?可以,因为在sz这个位置插入就相当于尾插,还有一点需要注意,那便是插入成员,成员的数量是会增加的,那么也就是说,我们一样要在插入前判断是否需要扩容。

void seqlist_insert(seqlist* s1, int pos, const SlDateType x)
{
	if_enough(s1);
	if (pos > s1->sz)//比sz还大,意味着插入的位置会导致连续性被破坏
	{
		printf("插入位置出错,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 0;i<s1->sz-pos; i++)
	{
		s1->a[s1->sz-i] = s1->a[s1->sz-i-1];//从后向前覆盖
	}
	s1->a[pos] = x;
	s1->sz++;
}

测试一下手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

10.定向删除(将目标位置的成员删除)

有了之前插入的经验,这个就显得很简单,但要注意的一点则是,它的删除范围只能是0~sz-1,sz不被包括在内,因为sz显而易见还不是成员。

void seqlist_erase(seqlist* s1, int pos)
{
	if (pos >= s1->sz)//等于sz时就已经是在删除未被定义的内容了
	{
		printf("删除位置出错,操作失败\n");
		return;
	}
	int i = 0;
	for (i=0;pos+i+1<s1->sz;i++)
	{
		s1->a[pos+i] = s1->a[pos+i+1];//从前向后覆盖
	}
	s1->sz--;
}

测试一下手把手教你怎么写顺序表,c语言实战项目,数据库,c语言,c++

 当我们完成了插入和定向删除,其实之前的头插头删,尾插尾删都可以通过这两个函数来替换,这里就不再一一展示,升级版直接放在全部代码里面。

三、全部代码

1.函数头文件

// SeqList.h
//将所需函数和所需头文件的引用放在一个头文件中,那么在使用的时候就只用引用一个头文件
#pragma once//防止头文件被重复引用
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>//可能要用到的头文件
typedef int SlDateType;
//将int typedef成SlDateType这样就可以区分int和顺序表成员
// 虽然它们的类型本质上都是int但是它们的字面含义已经不同
//当然了,可以把int换成别的类型
//这样子设计其实更多的是为了到时顺序表成员类型想更换直接从这换就全换了,不用一个一个换
typedef struct seqlist
{
	SlDateType* a;
	//创建一个指针类型的顺序表成员数据,为什么是指针?
	//这样做是为了到时能够使用malloc和realloc对空间的大小进行开辟与修改
	//相当于柔性数组
	int sz;//已经存放了多少个成员
	int capacity;//容量大小,以后判定空间是否够用可以通过这个来判定
}seqlist;//将结构体名字命名为seqlist,使用时更加方便
//初始化顺序表
void init_seqlist(seqlist*s1);
//打印顺序表
void print_seqlist(const seqlist* s1);
//尾增
void seqlist_pushback(seqlist* s1, SlDateType x);
//头增
void seqlist_pushfront(seqlist* s1, SlDateType x);
//尾删
void seqlist_popback(seqlist* s1);
//头删
void seqlist_popfront(seqlist* s1);
//查找成员
void seqlist_fine(const seqlist* s1,const SlDateType x);
//修改成员
void seqlist_modify(seqlist* s1, int pos, const SlDateType x);
//插入成员
void seqlist_insert(seqlist* s1, int pos, const SlDateType x);
//删除成员
void seqlist_erase(seqlist* s1, int pos);

2.函数实现

//顺序表.c
#include"顺序表.h"
void init_seqlist(seqlist* s1)//通过指针的形式访问,便能够对内容进行修改
{
	s1->capacity = 3;//将容量大小初始化为3,为了更好地测试到时的扩容效果
	s1->sz = 0;//将成员数量初始化为0,代表着此时没有存放成员
	s1->a = (SlDateType*)malloc(sizeof(SlDateType) * s1->capacity);
	//将顺序表的成员数组大小初始化和容量一样的大小
	if (s1->a == NULL)//开辟失败的话直接退出程序
	{
		exit(-1);
	}
}
void if_enough(seqlist* s1)
{
	if (s1->sz == s1->capacity)
	//当容量和成员个数相当时,显然就已经存满了,需要扩容
	{
		s1->a = realloc(s1->a,sizeof(SlDateType)*s1->capacity*2);
		//将容量扩大到原来容量的两倍
		if (s1->a == NULL)
		{
			perror("if_enough");//错误提示
			return;//中止程序
		}
		s1->capacity *= 2;//扩容成功,容量翻倍
		printf("扩容成功,当前容量为%d\n",s1->capacity);//扩容成功给个提示
	}
}
void print_seqlist(const seqlist* s1)
//将内容打印出来,但内容是不会被改变的,因此用const修饰,避免内容被修改
{
	if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 0; i < s1->sz; i++)
	{
		printf("%d ", s1->a[i]);//将内容通过循环的方式打印出来
	}
	printf("\n");//打印完所有内容之后最好换行
}
void seqlist_pushback(seqlist*s1,SlDateType x)
{
	//if_enough(s1);
	//s1->a[s1->sz] = x;//在顺序表的最后插入一个数据x
	//s1->sz++;
	seqlist_insert(s1,s1->sz,x);
}
void seqlist_pushfront(seqlist* s1, SlDateType x)
{
	//if_enough(s1);
	//int i = 0;
	//for (i=0;i<s1->sz;i++)//通过循环从后往前覆盖
	//{
	//	s1->a[s1->sz - i] = s1->a[s1->sz-i-1];
	//}
	//s1->a[0] = x;//将首元素替换成x
	//s1->sz++;
	seqlist_insert(s1,0, x);
}
void seqlist_popback(seqlist* s1)
{
	/*if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	s1->sz--;*/
	seqlist_erase(s1,s1->sz-1);
}
void seqlist_popfront(seqlist* s1)
{
	//if (s1->sz == 0)
	//{
	//	printf("顺序表为空,操作失败\n");
	//	return;
	//}
	//int i = 0;
	//for (i = 1; i < s1->sz; i++)
	//{
	//	s1->a[i-1] = s1->a[i];//从前往后覆盖
	//}
	//s1->sz--;
	seqlist_erase(s1,0);
}
void seqlist_fine(const seqlist* s1,const SlDateType x)
//查找的目标是x,用const修饰是因为只是查找,不用修改
{
	if (s1->sz == 0)
	{
		printf("顺序表为空,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 0;i<s1->sz; i++)
	{
		if (s1->a[i] == x)//相等意味着找到了
		{
			printf("找到%d了,下标为%d\n",x,i);
			return;
		}
	}
	printf("目标不存在\n");
}
void seqlist_modify(seqlist* s1, int pos, const SlDateType x)
{
	if (pos >= s1->sz)
	//当pos=sz时就已经是对还不是成员的空间进行操作了,更别说后面的了
	{
		printf("当前空间还不是成员的一部分,操作失败\n");
		return;
	}
	s1->a[pos] = x;
}
void seqlist_insert(seqlist* s1, int pos, const SlDateType x)
{
	if_enough(s1);
	if (pos > s1->sz)//比sz还大,意味着插入的位置会导致连续性被破坏
	{
		printf("插入位置出错,操作失败\n");
		return;
	}
	int i = 0;
	for (i = 0;i<s1->sz-pos; i++)
	{
		s1->a[s1->sz-i] = s1->a[s1->sz-i-1];//从后向前覆盖
	}
	s1->a[pos] = x;
	s1->sz++;
}
void seqlist_erase(seqlist* s1, int pos)
{
	if (pos >= s1->sz)//等于sz时就已经是在删除未被定义的内容了
	{
		printf("删除位置出错,操作失败\n");
		return;
	}
	int i = 0;
	for (i=0;pos+i+1<s1->sz;i++)
	{
		s1->a[pos+i] = s1->a[pos+i+1];//从前向后覆盖
	}
	s1->sz--;
}

好了,今天的分享到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O文章来源地址https://www.toymoban.com/news/detail-612317.html

到了这里,关于手把手教你怎么写顺序表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 手把手教你实战TDD

    领域驱动设计,测试驱动开发。 我们在《手把手教你落地DDD》一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解、TDD常见误区、TDD技术选型,以及案例实战。希望通过本文,读者能够理解掌握TDD并将其应用于实际

    2024年02月08日
    浏览(44)
  • AI绘画怎么弄?手把手教你制作

    最近关于AI绘画的话题是非常火爆的,小伙伴们了解AI绘画吗?这是一种由我们输入关于画面的描述,然后由AI根据这些描述自动生成画面的技术。现在有很多软件都可以实现AI绘画的操作,那你们知道AI绘画特效软件哪个好吗?想要制作AI绘画的小伙伴,下面就为你们带

    2024年02月11日
    浏览(59)
  • 怎么用AI绘画?手把手教你使用

    与传统的绘画方式不同,AI绘画软件采用了人工智能算法和计算机视觉技术,使艺术作品的创作变得更加智能化和自动化。这样,即使一个看不懂颜料,也毫无绘画经验的业余者也能创作出可圈可点的艺术品了。AI绘画软件因此被越来越多的创作者和爱好者所使用。那你们知道

    2024年02月15日
    浏览(61)
  • 【实战】手把手教你在 vscode 中写 markdown

    markdown 语法、markdown 插件咱先放放,先说最头疼的,图片问题 相对于 HBuilder 自带 markdown 图片粘贴功能来说,vscode显得不那么友好,若是不装插件粘贴截图就只能手动进行如下操作: 截取图片 将图片存在特定位置 在markdown文件中通过路径引入图片 预览 最终我找到了 Paste I

    2024年02月13日
    浏览(68)
  • 数据结构->顺序表实战指南,(手把手教会你拿捏数据结构顺序表)

    文章目录 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 今天开始我们正式进入数据结构的学习了,这篇简单了解一下: 线性表的存储结构:顺序存储结构、链式存储结构; 顺序表的定义:用一段物理地址连

    2024年01月25日
    浏览(58)
  • 【C语言】手把手教你文件操作

    程序运行时,数据存放在内存中,而当程序退出后,数据也就不复存在。 想做到数据持久化,我们可以把数据存放在硬盘,或者放到数据库里。而在C语言中,利用文件操作,就可以将数据存放在硬盘上。 读写之前应该先打开文件,使用结束之后要关闭文件。 fopen 函数用于打

    2024年02月05日
    浏览(39)
  • 爬虫实战|手把手教你用Python爬虫(附详细源码)

    实践来源于理论,做爬虫前肯定要先了解相关的规则和原理,要知道互联网可不是法外之地,你一顿爬虫骚操作搞不好哪天就…  首先,咱先看下爬虫的定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自

    2024年02月02日
    浏览(79)
  • 干货|手把手教你怎么做好一块PCB!保姆级教程

    目录 一.明确设计目标 二.了解所用元器件的功能对布局布线的要求 三. 元器件布局的考虑 四.对布线的考虑 1.传输线 2.传输线的几种类型 3.端接传输线 4.非端接传输线 5.几种端接方式的比较 五.PCB 板的布线技术 接受到一个设计任务,首先要明确其设计目标,是普通的 PCB 板、高

    2023年04月22日
    浏览(66)
  • 手把手教你从0搭建SpringBoot项目

    用到的工具:idea 2021、Maven 3.6.3、postman 框架:SpringBoot、Mybatis 数据库:Mysql8.0.30 安装配置参考博文 注意: 1.下载maven注意idea与Maven版本的适配: 2.为了避免每次创建项目都要改Maven配置,可以修改idea创建新项目的设置 二、安装数据库 mysql8安装参考博文 **注意:**连接不上往

    2024年02月03日
    浏览(45)
  • [R语言]手把手教你如何绘图(万字)

    目录 概况 常用高级图形 条形图 csv文件导入 csv文件导出 R语言sep函数 seq函数 with函数 直方图和密度估计图 盒型图 boxplot() 正态QQ图 散点图 pairs()散点矩阵图 曲线图 curve() 三维图 动态三维图 低级图形函数 abline() lines() legand()增加图例 axis()坐标轴 text()给图内区域添加文字 loc

    2024年02月04日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包