IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> c语言 --- 一维数组 -> 正文阅读

[数据结构与算法]c语言 --- 一维数组

认识一维数组

  • 如何创建一个数组

//No.1 数组的定义语法
//类型 数组名[数组长度]
int  num[3];
float fNum[3];
double dNum[3];
char cNum[3];
//类型: 学过的数据类型
//数组名: 随便起的
//数组长度: 根据具体需求决定数组长度

数组的长相(在内存上的长相)

  • 数组是什么? 多个变量名有规律并且内存连续的变量的集合(多个普通变量)

  • 创建时的数字是数组长度

  • 数组的初始化

//No.1 创建数组的时候赋值,数组长度和元素个数相同
int array[3]={1,2,3};   //{}不能省略,arary[0]=1 array[1]=2 array[2]=3
//No.2 元素个数和长度不同,默认初始化为0
int array2[3]={1};      //arary2[0]=1 array2[1]=0 array2[2]=0
//No.3 当初始化的元素完整,数组长度可以省略
int array3[]={1,2,3};	//自动推断数组长度为3
//No.4 不存在数组长度为0的数组
//int array4[];          错误的写法
//No.5 不能先创建数组再使用{}方式初始化
//int array[4];
//array[4]={1,2,3,4};    错误的写法

数组的访问

  • 数组名[下标]

  • 一般操作数组都是用循环操作(无论输入还是打印)

#include <stdio.h>
int main() 
{
	int array[3] = { 1,2,3 };
	//数组的打印
	int result = 0;
	for (int i = 0; i < 3; i++) 
	{
		printf("%d\t", array[i]);
		result += array[i];                     //数组求和II
	}
	printf("\n");
	int sum = array[0] + array[1] + array[2];   //数组求和I
	printf("sum:%d\n", sum);
	printf("sum:%d\n", result);
	//手动输入数据初始化数组
	for (int i = 0; i < 3; i++) 
	{
		scanf_s("%d", &array[i]);
	}
	for (int i = 0; i < 3; i++)
	{
		printf("%d\t", array[i]);
	}
	printf("\n");
	int num[4] = { 1 };
	for (int i = 0; i < 4; i++) 
	{
		printf("%d\t", num[i]);
	}
	//其他类型的数组操作都是一样
	double dNum[3] = { 1.33,2.33 };
	for (int i = 0; i < 3; i++) 
	{
		scanf_s("%lf", &dNum[i]);
	}
	for (int i = 0; i < 3; i++) 
	{
		printf("%.3lf\t", dNum[i]);
	}
	return 0;
}

/*输出*/

1       2       3
sum:6
sum:6
3 4 6
3       4       6
1       0       0       0  1.22 3.44 6.6
1.220   3.440   6.600

一维数组常规操作

  • 插入---有序插入

#include <stdio.h>
int main() 
{
	int array[100];				//数组能存储的最大元素个数是100
	int curSize = 0;			//当前元素个数是0
	int data = 0;
    //无序插入
    int data = 3;
    array[curSize++] = data;
    //无序插入后做调整--->有序插入
	while (1) 
	{
		printf("input data:");
		scanf_s("%d", &data);
		array[curSize++] = data;  //array[0]=1 curSize=1  
		//做调整--->从小到大排序
        //把元素直接放在数组后面,把插入的元素和前面的元素比较,比较到第一个位置结束: <的情况要交换元素的位置
		//在数组里面做下标-1操作或者+1操作,需要考虑下标合理性->临界值
		for (int pos = curSize - 1; pos > 0; pos--) 
		{
			if (array[pos] < array[pos - 1])  //相邻的元素做比较 | 做持续性的调整
			{ 
				int temp = array[pos];
				array[pos] = array[pos - 1];  //0-1: -1下标
				array[pos - 1] = temp;
			}
			else                              //>的情况不需要交换
			{
				break;
			}
		}
		int user = 0;
		while (getchar() != '\n');
		user = getchar();                //清空缓冲区
		if (user == 'n' || user == 'N')  //输入n和N退出 输入状态
			break;
	}
	for (int i = 0; i < curSize; i++) 
	{
		printf("%d\t", array[i]);
	}
	printf("\n");
	return 0;
}

/*输出*/

input data:8
y
input data:9
y
input data:55
n
8       9       55
  • 查找+删除(移位)

#include <stdio.h>
int main() 
{
	//查找和删除
	int array[10] = { 10,20,30,40,50,60,70,80,90,100 };
	int curSize = 10;
	//数组的删除叫做伪删除--->只是做位置的调整,不能真正把元素删除->把后面的元素往前挪,记录当前curSize--
	int data = 60;			//要找的数据
	//数组的查找-->如果数组中的值==要删除的元素->找到了要删除的下标
	int pos = -1;			//查找下标一般用-1,数组下标会是0-->如果第一个元素就是要查找的元素,返回0无法确定有没有找到 所以查找下标一般用0
	for (int i = 0; i < curSize; i++) 
	{
		if (array[i] == data) 
		{
			pos = i;        //记录找到元素下标
			break;
		}
	}
	if (pos == -1) 
	{
		printf("没有找到相关元素,无法删除!");
	}
	else                    //找到了做移位操作->调整数组
	{
		//在数组里面做下标-1操作或者+1操作,需要考虑下标合理性
		for (int k = pos; k < curSize-1; k++)   //k=9
		{
			array[k] = array[k + 1];			//array[10] 把数组后面的元素往前挪,记录数组长度的curSize--
		}
		curSize--;			//数组真正的删除
	}
	for (int i = 0; i < curSize; i++) 
	{
		printf("%d\t", array[i]);
	}
	printf("\n");
	return 0;
}

/*输出*/

10      20      30      40      50    70      80      90      100
  • 查找+修改

#include <stdio.h>
int main() 
{
	//查找和修改
	int array[10] = { 10,20,30,40,50,60,70,80,90,100 };
	int curSize = 10;									//记录当前数组中元素个数
	int data = 60;
	int pos = -1;
	for (int i = 0; i < curSize; i++) 
	{
		if (array[i] == data) 
		{
			pos = i;
			break;
		}
	}
	if (pos == -1) 
	{
		printf("没有找到无法修改!\n");
	}
	else  //修改数据                               
	{
		printf("请输入新的值:");
		scanf_s("%d", &array[pos]);
	}
	for (int i = 0; i < curSize; i++) 
	{
		printf("%d\t", array[i]);
	}
	
	return 0;
}
/*输出*/

请输入新的值:34
10      20      30      40      50    34    70      80      90      100
  • 排序--->冒泡排序

第一次冒泡找到第一大的,第二次冒泡找第二大的,找第二大的可以减少一次比较次数,因为第一大的已经出来了,没必要拿第二大的和第一大的去比较:找第几大的元素(n>1)减少n-1次比较次数

#include <stdio.h>
int main() 
{
	//冒泡排序
	int array[10] = { 60,70,80,90,100,10,20,30,40,50 };
	int curSize = 10;
	//排序
	//int count = 0;
	for (int i = 0; i < curSize; i++)          //每个元素都需要一个机会冒泡->描述每一个元素的冒泡
	{
		for (int j = 0; j < curSize-1-i/*不优化直接< curSzie-1*/; j++)  //描述每个元素冒泡过程 -i: i代表第几个元素的冒泡操作
		{
			//从小到大排序
			if (array[j] > array[j + 1])       //不满足规则交换
			{
				int temp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = temp;
				//count++;                     //记录比较次数
			}
		}
	}
	for (int i = 0; i < curSize; i++) 
	{
		printf("%d\t", array[i]);
	}	
	return 0;
}
//选择排序+插入排序+计数排序+桶排序+快排+堆排序+希尔排序+归并排序
/*输出*/

10      20      30      40      50      60      70      80      90      100

字符数组和字符串

  • 字符数组和数字类数组处理方案相同

  • 字符串: 存在一个不可见字符 ' \0 '

  • 字符串的打印: %s去做打印

    • %s的工作原理: 从首地址(第一个元素的地址) &inputstr[0] 打印到 ' \0 ' 结束,所以%s对应的是地址

//No.1 字符数组
	char array[] = { 'A','B','C' };  //自动推断数组长度为3
	for (int i = 0; i < 3; i++)      //字符数组必须要用for循环做打印|不能用"%s"的方式打印
	{
		putchar(array[i]);
	}
	putchar('\n');
	//No.2 字符数组操作字符串
	//字符串有一个不可见字符'\0'
	char str[] = "ILoveyou";         //自动长度是:9
	char inputstr[] = { 'A','B','C','D','\0','A','B','C' };
	//%s对应的是地址
	printf("%s\n", &inputstr[0]);    //ABCD  &inputstr[0]到'\0'结束
	printf("%s\n", &inputstr[2]);	 //CD    &inputstr[2]到'\0'结束
	printf("%s\n", &array[0]);		 //ABC烫烫烫烫烫烫烫烫烫烫烫烫烫烫?
    //字符数组和字符串的区别:字符数组没有'\0',不知道打印到什么时候结束,把后面的无用内存都打印出来了
	//	0    1   2   3    4   5   6   7
	//{ 'A','B','C','D','\0','A','B','C' }
	// 数组名代表第一个元素的地址
	char output[] = "ILoveyou";
	printf("%s\n", output);          //&output[0]
	int key = 0;
	scanf_s("%d", &key);
	while (getchar() != '\n');		 //字符串做输入前做了输入,可能会存在跳过现象,可以清除缓冲区
	char username[10];
	printf("请输入用户名:");
	//scanf不需要加长度,增强版要加长度 
	//scanf输入不接受带空格的输入
	scanf_s("%s", username,10);  
	printf("name:%s\n", username);
	//解决scanf输入不接受带空格的输入的问题: 字符串输入函数 gets:输入+puts:打印
	char passw[20];
	//所有的字符串处理用的都是数组名
	printf("输入密码:");
	while (getchar() != '\n');       //存在跳过现象需要清空缓冲区
	gets_s(passw, 20);		         //20指的是passw的长度,vs对这个函数进行了改进gets(passw)--->把输入的元素放到数组中
	puts(passw);			         //输出自带换行
	printf("-----\n");

/*输出*/

ABC
ABCD
D
ABC烫烫烫烫烫烫烫烫烫烫烫烫烫烫?
ILoveyou
e
请输入用户名:I Love                   //只接收I 空格后面的接收不了--->空格会截取字符串
name:I
输入密码:HH LL                        //用gets做输入可以接收空格
HH LL
-----

字符串处理函数

  • 包含字符串处理头文件 #include<string.h>

  • strcat:连接

  • strcpy:拷贝? ---> 注意:第一个字符串的长度要 ≥ 第二个字符串的长度,把后面的字符串 strFirst 拷贝到前面的字符串 strSecond 中去

  • strcmp:比较 ---> 字符串不能直接比较,需要调用函数去比较

  • strlen:统计可见长度

#include <stdio.h>
#include <string.h>
int main()
{
	//string.h			--->字符串处理头文件
	char strFirst[] = "ILoveyou";
	int lenght = strlen(strFirst);		//可见长度不包含\0
	printf("可见长度:%d\n", lenght);
	char strSecond[10];
	strcpy_s(strSecond, 10, strFirst);  //原版:strcpy(strSecond, strFirst);   把"ILoveYou"拷贝到strSecond中去 增强版加入第一个字符串的尺寸
	puts(strSecond);
	char strThird[100] = { "666" };
	strcat_s(strThird, 100, strSecond);	//原版:strcat(strThird, strSecond);   把strSecond连接到strThird后面
	puts(strThird);
	//比较
	//比较结果
	char first[] = "abc";
	char second[] = "bca";
	char third[] = "abc";
	int result=strcmp(first, second);    //传入两个数组名,返回值是整数
	//					 a     b
	//a-b>0			a>b  1
	//a-b<0			a<b -1
	//a-b==0		a==b 0  
	printf("==:%d\n", strcmp(first, third));
	printf("<:%d\n", strcmp(first, second));
	printf(">:%d\n", strcmp(first, "aaa"));
	//比较规则
	//自左往右比,如果相同就去找下一个,一旦找到不同的字符,比较结果就出来了,根据ASCII码比较字符,与字符串的长度无关
	//"abc" "bc"   'a'<'b'  所以:"abc"<"bc";
	//"aabc" "aaa" 'b'>'a'  所以 "aabc">"aaa";
	//"aab" "aa"   'b'>'\0' 所以 "aab">"aa";
	//一般字符串用的循环是while循环
	char string[] = "ILoveyou";   
	//strlen函数的实现
	int count = 0;
	while (string[count] != '\0')          //求字符串的可见长度通过字符串的结束标记去判断
	{
		count++;                           //不等于'\0' count一直做++运算
	}
	printf("size:%d\n", count);

	return 0;
}

/*输出*/

可见长度:8
ILoveyou
666ILoveyou    //把ILoveyou连接到666后面
==:0
<:-1
>:1
size:8
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:43:30  更:2022-03-16 22:49:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:44:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码