本博文主要参考书籍和视频:严蔚敏 吴伟民 编著的《数据结构(c语言版)》 和 高一凡编著的《《数据结构》 算法实现及解析》还有郝斌的数据结构自学视频。本人如有什么错误,希望各位不吝赐教,谢谢。
数据结构概述
定义 :我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应操作也叫做算法。
数据结构 = 个体 + 个体的关系
算法 = 对存储数据的操作。
算法:
解题的方法和步骤
衡量算法的标准
1.时间复杂度
大概程序要执行的次数,而非执行的时间
2.空间复杂度
算法执行过程中大概所占用的最大内存
3.难易程度
4.健壮性
数据结构的地位
数据结构是软件中最核心的课程
程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言
难度大,不能立即有成效
预备知识
指针
指针的重要性:
指针是C语言的灵魂
定义:
地址
地址就是内存单元的编号
从0开始的非负整数
范围:0 - FFFFFFFF[0 ~4G-1]
指针:
指针就是地址,地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
分类:
1.基本类型的指针
2.函数类型的指针
结构体(类)
动态内存的分配和释放
下面把一些程序放上来:
#include <stdio.h>
int main(void)
{
int *p;//p是个变量名字,int *表示该p变量只能存储int类型变量的地址
int i = 10;
int j;
p = &i;
//p = 10; //error
j = *p;
printf("%d\n",j);
return 0;
}
#include<stdio.h>
void f(int *i)
{
*i = 100;
}
int main(void)
{
int i = 9;
f(&i);
printf("i = %d\n",i);
return 0;
}
#include<stdio.h>
void f(int **);
int main(void)
{
int i = 10;
int *p = &i;
printf("%p\n",p);
f(&p);
printf("%p\n",p);
printf("i = %d\n",i);
return 0;
}
void f(int **p)
{
*p = (int *)0xFFFFFFFF;
//*p = 99;
}
#include<stdio.h>
void f(int *);
int main(void)
{
int i = 10;
f(&i);
printf("i = %d\n",i);
return 0;
}
void f(int *p)
{
*p = 100;
}
#include<stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
printf("%d",3[a]);
printf("%p\n",a+1);
printf("%p\n",a+2);
printf("%p\n",a+3);
return 0;
}
#include<stdio.h>
void Show_Array(int *p,int len)
{
int i = 0;
//p[0] = -1;
for(i = 0;i < len;++i)
{
printf("%d\n",p[i]);
}
}
int main(void)
{
int a[5] = {1,2,3,4,5};
Show_Array(a,5); //a等价于&a[0],&a[0]本身就是int*类型
//printf("%d\n",a[0]);
return 0;
}
#include<stdio.h>
int main(void)
{
double *p;
double x = 66.6;
p = &x; //x占8个字节,1个字节是8位,1个字节一个地址
double arr[3] = {1.1,2.2,3.3};
double *q;
q = &arr[0];
printf("%p\n",q); //%p实际就是以十六进制输出
q = &arr[1];
printf("%p\n",q);
}
#include<stdio.h>
#include<malloc.h>
int main(void)
{
int a[5] = {4,10,2,8,6};
int len;
printf("请输入你需要分配的数组的长度:len = ");
scanf("%d",&len);
int *pArr = (int *)malloc(sizeof(int) * len);
/* *pArr = 4;//类似于a[0] = 4;
pArr[1] = 10;
printf("%d %d",*pArr,pArr[1]);*/
///我们可以把pArr当做一个普通数组来使用
int i;
for(i = 0;i < len;++i)
scanf("%d",&pArr[i]);
for(i = 0; i < len; ++i)
printf("%d\n",*(pArr + i));
free(pArr);
return 0;
}
#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct Student
{
int sid;
char* name;
int age;
};
struct Student * createStudnet();
void showStudent(struct Student*);
int main(void)
{
struct Student *stu;
stu = createStudnet();
showStudent(stu);
return 0;
}
struct Student * createStudnet()
{
struct Student *p = (struct Student *)malloc(sizeof(struct Student));
p->sid = 1000;
strcpy(p->name,"coemontom");
p->age = 18;
return p;
}
void showStudent(struct Student* pstu)
{
printf("%d %s %d",pstu->sid,pstu->name,pstu->age);
}
#include<stdio.h>
#include<string.h>
struct Student
{
int sid;
char name[200];
int age;
};
int main(void)
{
struct Student stu = {1000,"comeontom",20};
printf("%d %s %d \n",stu.sid,stu.name,stu.age);
stu.sid = 2000;
//stu.name = "tom";error
strcpy(stu.name,"tom");
stu.age = 18;
printf("%d %s %d \n",stu.sid,stu.name,stu.age);
return 0;
}
#include<stdio.h>
#include<string.h>
struct Student
{
int sid;
char name[200];
int age;
};
void f(struct Student *);
void g(struct Student );
void g2(struct Student *);
int main(void)
{
struct Student stu = {1000,"tom",20};
//stu.sid = 99;//第一种方式
g2(&stu);
f(&stu);
g2(&stu);
return 0;
}
///这种方法不推荐 因为占内存 耗空间
void g(struct Student stu)
{
printf("%d %s %d \n",stu.sid,stu.name,stu.age);
}
void g2(struct Student *pit)
{
printf("%d %s %d \n",pit->sid,pit->name,pit->age);
}
void f(struct Student *pit)
{
pit->sid = 2000;
strcpy(pit->name,"comeontom");
pit->age = 18;
}