数据结构(一)

7 篇文章 0 订阅
3 篇文章 0 订阅

小编在寒假期间,在家里看了郝斌老师的数据结构,于是,根据韩斌老师的视频,小编整理了如下8偏数据结构。


数据结构概念:

 

抛砖引玉:现实生活中存在的大量而复杂的问题,比如,一个班级,我们可以使用数组来实现。全国人口我们可以用链表来实现。铁路系统可以使用图结构来实现。公司的职员关系可以用树结构来实现。等等

 

那么我们解决问题的方法就是算法,而表示问题的数据类型和存储结构则为数据结构。

 

明白一点:在数据结构中,只有栈(将数据存入内存),没有堆(内存分配方式),栈也可以称为堆栈(数据结构中)

 

算法衡量四个标准:

1.时间复杂度,是指执行程序所需要的次数

2.空间复杂度,是指执行程序所需要的最大内存

3.难易程度

4.健壮性

 

数据结构在软件工程中的地位:核心之一

 

学习数据结构的计算机语言:c/c++,因为涉及大量指针,链表。用java的都是胡扯。

 

一句话:想成为高手一定要学数据结构,不学数据结构是成不了高手的。

 

那么下面就是学习数据结构的基本知识了:指针、结构体(类)、链表

 

指针:指针是c语言的灵魂。指针的本质是地址。什么是地址,科普一下:cpu操作内存有三条线,地址线获取地址,控制器控制是对地址的操作(读或写),数据线传输数据,而地址(我的电脑,物理内存4G)是指把电脑的4G内存分割成1-4G-1)份地址,地址就是指其中的一份,指针表示的就是这些地址

 

 

 

上面的c代码,我是这样理解的,系统有1-4G-1)的垃圾数字命名的内存`int * p,即向系统请求获取一个内存(地址),p=&i,即指针p指向了i,所以p的值也就是i的值,同时,地址p被系统标记为使用,系统不会把p分配给其他,当该程序执行完后,取消地址p被标记(回收该单元地址的访问控制权限)。内存得以释放。但是,系统并不清空该地址遗留的数值,所以在java中,局部变量必须要初始化才能使用(new 一个),当然,我更加关心地址的指向问题,看下面两段代码:

 

 

 

局部变量只能在定义该变量的函数内使用,所以传入数值,在调用函数fi的值并没有改变,更底层与栈的排列有关

 

 

 

 

如果传入的是一个指针变量,想改变传入指针变量指向的地址:实参的类型得改变为int **

 

 

 

如果传入地址,即将地址i重新赋值,原先是9,现在变为100

数组指针:数组名即为数组第一个元素的地址

 

 

其实,函数show_Array内部a[j]是等价于主函数的a[i]的,a[4]等价于*a[0+4],通常指针存放数组的第一个元素的第一个字节地址,数据类型占多少字节,指针指向的第二个元素将往后推多少个字节,例如,double8个字节,16进制:24+8=2c2c+8=34

 

指针变量统一只占4个字节,不管它指向的变量是多少个字节,都只占4个字节。

 

结构体:

 

c的结构体跟java的类很像,java有方法,c没有


#include<stdio.h>
#include<string.h>
struct Student
{
	int sid;
	char name[200];
	int age;
};//·ÖºÅ¾ø²»ÄÜÊ¡
int main(void)
{
	struct Student st={1000,"ÄãºÃ",20};
	struct Student * pst;
	printf("st.sid=%d\nst.name=%s\nst.age=%d\n",st.sid,st.name,st.age);
	printf("**µÚÒ»ÖÖ·½Ê½¸³Öµ**\n");
	st.sid=99;
	//st.name="Hello";
	strcpy(st.name,"Hello");
	st.age=21;
	printf("st.sid=%d\nst.name=%s\nst.age=%d\n",st.sid,st.name,st.age);
	printf("**µÚ¶þÖÖ·½Ê½¸³Öµ**\n");
	pst=&st;
	pst->sid=88;
	strcpy(pst->name,"hi");
	pst->age=19;
	printf("%d\n%s\n%d\n",pst->sid,pst->name,pst->age);
	return 0;

}



上面第二种赋值方式还可以调用函数来实现:


#include<stdio.h>
#include<string.h>
struct Student
{
	int sid;
	char name[200];
	int age;
};
void f(struct Student * pst);
void g(struct Student st);
int main(void)
{
	struct Student st;
	f(&st);
	g(st);
	return 0;
}
void f(struct Student * pst)
{
	//(*pst).sid=99;
	pst->age=20;
	strcpy(pst->name,"Hi");
	pst->sid=100;
	printf("%d\n%s\n%d\n",pst->age,pst->name,pst->sid);
}
void g(struct Student st)
{
	printf("**************\n");
	printf("%d\n%s\n%d\n",st.age,st.name,st.sid);
}


上面的例子说明,传入结构体参数可以是结构体,也可以是结构体的地址,但是在结构体中,int 4个字节,char name[200]个字节,Student结构体的字节数〉208个,而结构体指针默认是4个字节,同样的结果,指针的优势很明显可以省下很大内存,速度也快。可惜java把指针给砍掉了。

 

malloc函数,向系统请求内存,free函数是释放内存。在下面的代码中,值得注意的是,

int * parr=(int *)malloc(sizeof(int) * len);

该句(int  *)不是强转int类型。是告诉malloc函数请求到的内存是int类型,将请求的字节一4个(int)的形式赋给parrparr[0]就是前4个字节,parr[1]就是4-8个字节。malloc函数动态请求的内存必须要手动free函数释放。另外,




跨函数使用内存:


#include<stdio.h>
#include<malloc.h>
struct Student
{
	int age;
	int sid;
};
struct Student * CreateStudent(void);
void ShowStudent(struct Student * pst);
int main(void)
{
	struct Student * ps;
	ps=CreateStudent();
	ShowStudent(ps);
	return 0;
}
void ShowStudent(struct Student * pst)
{
	printf("%d\n%d\n",pst->age,pst->sid);
}
struct Student * CreateStudent(void)
{
	struct Student * p=(struct Student *)malloc(sizeof(struct Student *));
	p->age=20;
	p->sid=100;
	return p;
}



上面的代码是:在struct Student * CreateStudent(void);函数中,请求内存并将p返回给主函数的ps


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值