C/C++刷题预备——数据结构(二)使用线性表实现增删改查

代码

最终增加的数据元素算法操作如下

#include "stdio.h"
#define max 10 //这个列表所能承受的最多元素个数
typedef struct
{
	//为了简化操作:数据元素简单认为是int类型

	int	data[max];
	int length;//这个顺序表现有数据元素个数
}seqlist;
//增
bool listinsert(seqlist &l, int i, int a)//试图修改链表,所以要用引用,(链表,插入元素位置,插入元素)
{
	if ( i>max || i< 0)//非正常插入
		return 0;
	for (int j = l.length; j >= i; j--)//从尾部查找位置,后一个等于前一个
	{	
		l.data[j] = l.data[j - 1];
	}
	l.data[i - 1] = a;
	l.length++;
	return 1;
}; 
void showdata(seqlist l)
{
	for (int i = 0;i< max;i++) 
	{
		printf("seqlist.data[%d]=%d\n",i,l.data[i]);
	};
	printf("now,seqlist.length=%d\n", l.length);
}
int main()
{
	seqlist	seqlist1 = { {1,2},2};//实例-初始化
	showdata(seqlist1);
	//实现增
	bool c=listinsert(seqlist1, 2, 3);//报错:非常量引用只能做左值
	printf("%d", c);
	showdata(seqlist1);
	printf("hello\n");
	return 0;
}

附录1:常用的格式化输出(%语法)

感谢:

https://blog.csdn.net/qq_42402648/article/details/109199029

1整形输出:

  1. %o —— oct 八进制
  2. %d —— dec 十进制
  3. %x —— hex 十六进制

2浮点输出

  1. %f ——保留小数点后面六位有效数字
  2. %.3f,保留3位小数位
  3. %e ——保留小数点后面六位有效数字,指数形式输出
  4. %.3e,保留3位小数位,使用科学计数法
  5. %g ——在保证六位有效数字的前提下,使用小数方式,否则使用科学计数法
  6. %.3g,保留3位有效数字,使用长度不超过六位用小数或超过六位用科学计数法

3字符串输出

  1. %s
  2. %10s——右对齐,占位符10位
  3. %-10s——左对齐,占位符10位
  4. %.2s——从左开始,截取2位字符串
  5. %10.2s——10位占位符,截取两位字符串

这个博客还有关于转义字符的使用(比如\n),可以仔细看看

附录2 print,printf区别

【Python】print格式化输出_兔子爱读书的博客-CSDN博客_print输出格式

printf输出全格式(C语言)_柏源宜次的博客-CSDN博客_printf输出格式

print与printf的区别

  1. print 中不能使用%s ,%d 或%c;
  2. print 自动换行,printf 没有自动换行。所以在字符串中加入\n

简单来说:使用print()进行打印就行。

附录3线性表的增删改查

#include "stdio.h"
#define max 10 //这个列表所能承受的最多元素个数
typedef struct
{
	//为了简化操作:数据元素简单认为是int类型

	int	data[max];
	int length;//这个顺序表现有数据元素个数
}seqlist;
//增
bool listinsert(seqlist &l, int i, int a)//试图修改链表,所以要用引用,(链表,插入元素位置,插入元素)
{
	printf("insert,%d,in,%d\n", a, i);
	if ( i>max-1 || i< 0)//非正常插入
		return 0;
	for (int j = l.length; j >= i; j--)//从尾部查找位置,后一个等于前一个
	{	
		l.data[j] = l.data[j - 1];
	}
	l.data[i - 1] = a;
	l.length++;
	return 1;
};
//删
bool listdel(seqlist& l, int i)//链表,位置
{
	printf("del=%d\n", i);
	if (i > max || i < 0)
		return 0;
	for (int j = i; j <= l.length - 1; j++)//从中间位置直接往后覆盖
	{
		l.data[j-1] = l.data[j ];//这一个位置上的数被下一个数覆盖了
	};
	l.data[l.length - 1] = 0;
	l.length--;
	return 1;
}
//改
bool changelist(seqlist& l, int i, int a)//(链表,修改元素位置,修改元素)
{
	printf("change,%d,in,%d\n", a, i);
	if (i > max || i < 0)//非正常插入
		return 0;
	for (int j = i - 1; j < l.length - 1; j++)//直接定位
	{
		l.data[j] = a;//覆盖这个位置上的数
	};
	return 1;
};
//查
void findlist(seqlist& l,  int a)//(链表,查找元素)
{
	int i = 0;
	printf("now,find in list,%d,\n", a);
	for (int j = 0; j <=l.length - 1; j++)//直接定位
	{
		if (l.data[j] == a)
		{
			i++;
			printf("%d is finded in list.data[%d]\n",a,j);
		}
	};
	printf("%d is count %d\n", a, i);
};



void showdata(seqlist l)
{
	for (int i = 0;i< max;i++) 
	{
		printf("seqlist.data[%d]=%d\n",i,l.data[i]);
	};
	printf("now,seqlist.length=%d\n", l.length);
}
int main()
{
	seqlist	seqlist1 = { {1,2,3},3};//实例-初始化
	showdata(seqlist1);
	//实现增
	bool c=listinsert(seqlist1, 2, 3);//如果报错:非常量引用只能做左值,可能是自己定义错了
	printf("%d\n", c);
	showdata(seqlist1);
	
	//实现删除
	bool d = listdel(seqlist1, 2);
	printf("%d\n", d);
	showdata(seqlist1);
	
	//实现改
	bool e = changelist(seqlist1, 2 , 3);
	printf("%d\n", e);
	showdata(seqlist1);

	//实现查找
	findlist(seqlist1, 3);

	printf("hello\n");
	return 0;
}

附录4浅谈一下为什么要花大多数时间练习编程

最后还有一些空间,简单介绍一下为什么要开这个板块
最主要的原因是C++还有C学习理论太快了,以至于根基不稳,可以想象敲代码的时候还在考虑for是怎么循环的,尤其碰到:在VS2019c++文件中不能在main函数中定义其他函数了这种坑设定。c++知识掌握不牢,编译器某些问题不清楚,这就很折磨人;尤其是马上要刷leetcode,这明显不行,索性就开了这个板块,用数据结构来练手,希望能够提高自己的实际编码能力。

你可能感兴趣的:(数据结构,c++,c语言,数据结构)