🌞欢迎来到图解数据结构的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
📆首发时间:🌹2024年7月12日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
必备知识
知识框架
本节一共有4个点,分别是宏定义、元素类型说明、数组定义、参数传递。
宏定义
#define PI 3.14159
在这个例子中,PI是一个宏常量,表示圆周率。在代码的其他地方,所有出现 PI
的地方都会被替换为 3.14159
。
常用到的预定义常量和类型
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
元素类型说明
typedef char ElemType;
其中ElemType就相当与char。
typedef struct{
int data[2];
int length; //当前长度
}SqList; //定义顺序表类型
这段代码,我们定义了一个顺序表的类型,它包含了两个元素,一个有两个元素的数组和一个便是当前长度的数据。
数组定义
- 静态分配:固定大小,编译时确定,内存放在栈上。
- 动态分配:灵活大小,运行时确定,内存放在堆上。
数组静态分配
#include<stdio.h>
#define MAXSIZE 10 //MAXSIZE是根据实际问题定义的足够大的整数常量
typedef int DataType;
typedef struct{
DataType data[MAXSIZE];
int length;
}SqList; //定义顺序表类型
int main() {
SqList L;
return 0;
}
数组动态分配
#include<stdio.h>
#define MAXSIZE 10 //MAXSIZE是根据实际问题定义的足够大的整数常量
typedef int DataType;
typedef struct{
DataType *data;//定义了一个指针变量存放地址
int length;
}SqList; //定义顺序表类型
int main() {
SqList L;
L.data=(DataType*)malloc(sizeof(DataType)*MAXSIZE);//在C++中也可以使用new,和delete
free(L.data); //释放空间
L.data=NULL;
return 0;
}
参数传递
- 传值调用:传变量的值,函数内修改不会影响原变量。
- 传址调用:传变量的地址,函数内修改会直接影响原变量。
传值调用
#include<iostream>
using namespace std;
void swap(int m,int n){
int temp;
temp=m;
m=n;
n=temp;
}
int main()
{ int a=5,b=10;
cout<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<"b="<<b<<endl;
return 0;}
传址调用--指针变量作为参数
#include<iostream>
using namespace std;
void swap(int* m,int* n){
int temp;
temp=*m;
*m=*n;
*n=temp;
}
int main()
{ int a=5,b=10;
cout<<"a="<<a<<"b="<<b<<endl;
swap(&a,&b);
cout<<"a="<<a<<"b="<<b<<endl;
return 0;}
传址调用--引用作为参数
#include<iostream>
using namespace std;
void swap(int &m,int &n){
int temp;
temp=m;
m=n;
n=temp;
}
int main()
{ int a=5,b=10;
cout<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<"b="<<b<<endl;
return 0;}
传址调用--数组名作为参数
#include<iostream>
using namespace std;
void swap(int m[],int n[]){
int temp;
temp=m[0];
m[0]=n[0];
n[0]=temp;
}
int main()
{ int a=5,b=10;
cout<<"a="<<a<<"b="<<b<<endl;
swap(&a,&b);
cout<<"a="<<a<<"b="<<b<<endl;
return 0;}
内存结构
数据结构基本概念
基本概念
逻辑结构
- 集合:各个元素同属于一个集合(微信中的好友的名单)
- 线性结构:一对一的关系(排队买票)
- 树形结构:一对多的关系(文件系统)
- 图形结构:多对一的关系(微信中好友的关系图)
物理结构
- 顺序存储结构:连续存储,按照顺序排列,像书架上的书籍。
- 链式存储结构:非连续存储,通过指针连接,像项链上的珠子。
- 索引存储结构:通过索引表快速定位,像书的目录。
- 散列存储结构:通过哈希函数直接定位,像快递柜的取件码。
时间复杂度
逐步递增型爱你
//算法一 逐步递增型爱你
void loveYou(int n) //n为时间规模
{
int i=1;
while(i<=n) {
i++;
printf("I Love You %d\n",i);}
printf("I Love You More Than %d\n",n);
}
int main()
{
loveYou(3000);
}
嵌套循环增型爱你
//算法2 嵌套循环增型爱你
void loveYou(int n) //n为时间规模
{
int i=1;
while(i<=n) {
i++;
printf("I Love You %d\n",i);
for(int j=1;j<=n;j++)
printf("I am Iron man");}
printf("I Love You More Than %d\n",n);
}
int main()
{
loveYou(3000);
}
指数递增型爱你
//算法3 指数递增型爱你
void loveYou(int n) //n为时间规模
{
int i=1;
while(i<=n) {
i=i*2;
printf("I Love You %d\n",i);}
printf("I Love You More Than %d\n",n);
}
int main()
{
loveYou(3000);
}
搜索数字型爱你
//算法4 搜索数字型爱你
for(int i=0;i<n;i++) {
if(flag[i]==n) {
printf("I Love You");
break;}
}
空间复杂度
void loveYou(int n) //n为时间规模
{
int i=1;
while(i<=n) {
i++;
printf("I Love You %d\n",i);}
printf("I Love You More Than %d\n",n);
}
int main()
{
loveYou(3000);
}
void test(int n){
int flag[n][n];//声明n*n的二维数组
int other[n];//声明长度n的二维数组
int i;
}
//算法一 逐步递增型爱你
void loveYou(int n) //n为时间规模
{
int flag[n]; //n是问题规模,n在递归中是变化的
if(n>1) {
loveYou(n-1);
}
printf("I Love You %d\n",n);
}
int main()
{
loveYou(5);
}