L1--数据结构简介与预备知识

介绍

  如何把现实中大量而复杂的问题以特定的数据类型特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应的操作,这个相应的操作叫做算法。

  数据结构 = 个体 + 个体的关系

  算法 = 对存储数据的操作(解题的方法和步骤)

衡量算法的标准

  • 1.时间复杂度:大概程序要执行的次数,而非执行的时间;
  • 2.空间复杂度:算法执行过程中,大概所占用的最大的内存;
  • 3.难易程度
  • 4.健壮性

数据结构的地位

  数据结构是软件中最核心的内容。

  程序 = 数据的存储 + 数据的操作 + 可以被计算存储的语言(C,C++等等)

预备知识-指针

  指针的重要性:指针是C语言的灵魂

  地址:内存单元的编号,从0开始的非负整数,范围:0---FFFFFFFF[0---4G-1]

  指针:指针就是地址 地址就是指针

  指针变量:就是存放地址的变量

#include <stdio.h>

int main(void)
{
    int * p; //p是个指针变量,int * 表示该p变量只能存储int类型变量的地址
    /*ps:int *是一个整体(定义一个指针变量,类似int),不要把*p当一个整体
        int   p相当于定义一个p变量
        int * p相当于定义一个p指针变量
    */
    int i = 10;
    int j;

    p = &i;
    j = *p; //等价于 j = i
    //此时的p存放了i的地址i,此时的*起到间接取值的作用,*p就等于。
    printf("i = %d, j = %d, *p = %d\n",i, j, *p);
    return 0;
}
/*
输出结果:i = 10, j = 10, *p = 10
*/

  指针和函数:

#include <stdio.h>

void f(int * p)//同上个程序:不是定义了一个名字叫做*p的形参,而是定义了一个形参是int *指针变量类型的指针变量p
{
    *p = 100;//此时的p存放了i的地址i,此时的*起到间接取值的作用(*只能使用在指针变量 ),*p就等于。
}

int main(void)
{
    int i = 9;
    f(&i);
    printf("i = %d\n", i);

    return 0;
}
/*
输出结果:i = 100ps:通过上面的例子可以使变量在不同的函数间使用,试想如果没有指针变量,是否还能使变量在不同的函数间使用
*/

  指针和数组:

    数组名:

      一维数组名是个指针常量

      它存放的是一维数组第一个元素的地址;

       它的值不能被改变;

      一维数组名指向的是数组的第一个元素。

    下标和指针的关系:

      a[i] (<==>) *(a + i)

#include <stdio.h>

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};

    printf("%p\n", a + 1);
    printf("%p\n", a + 2);
    printf("%p\n", a + 3);
    printf("----------------------------\n");
    printf("%d\n", *a + 3);//*a + 3等价于a[0] + 3
    return 0;
}
/*
输出结果:
0028FEF0
0028FEF4
0028FEF8
----------------------------
4
*/

 如何通过被调函数修改主调函数中一位数组的内容

   1.存放数组首元素的指针变量;

   2.存放数组元素长度的整形变量。

#include <stdio.h>

void showArray(int * p, int len)
{
    int i;
    p[0] = -1;//p[0] == *p;p[i]就是主函数的a[i]
    for ( i = 0; i < len; ++i)
    {
        printf("%d\n", p[i]);

    }
    printf("-----------------------\n" );
}

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
    showArray(a, 5); //a等价于&a[0],

    printf("%d\n", a[0]);
    return 0;
}
/*
输出结果:
-1
2
3
4
5
-----------------------
-1
*/

预备知识-结构体

  1.为什么出现结构体

    为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。

  2.什么叫结构体

    结构体是用户根据实际需要自己定义的复合数据类型。

  3.如何使用结构体

#include <stdio.h>
#include <string.h>

struct Student
{
    int sid;
    char name[200];
    int age;
};//分号不能省

int main(void)
{
    struct Student st = {1000, "zhangsan", 20};
    printf("%d %s %d\n",st.sid, st.name, st.age);

    st.sid = 99;
    strcpy(st.name, "lisi");
    st.age = 22;
    printf("%d %s %d\n",st.sid, st.name, st.age);

    struct Student * pst;
    pst = &st;
    pst->sid = 88;//pst->sid等价于(*pst).sid,而(*pst).sid等价于st.sid
    printf("%d %s %d\n",st.sid, st.name, st.age);
    return 0;
}
/*
输出结果:
1000 zhangsan 20
99 lisi 22
88 lisi 22
*/ 

  4.注意事项:

  • 结构体变量不能加减乘除,但可以相互赋值;

普通结构体变量和结构体指针变量传参问题

#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 st;//为st分配好内存

    f(&st);
    //g(st);//直接把整体变量(至少208个字节)当实参传过去,耗内存,耗时间
    g2(&st);//仅仅4个字节
    //printf("%d %s %d\n",st.sid, st.name, st.age);
    return 0;
}

void f(struct Student * pst)
{
    (*pst).sid = 99;
    strcpy(pst->name, "zhangsan");
    pst->age = 22;
}
void g(struct Student st)
{
    printf("%d %s %d\n",st.sid, st.name, st.age);
}
void g2(struct Student * pst){
    printf("%d %s %d\n",pst->sid, pst->name, pst->age);
}
/*
输出结果: 99 zhangsan 22
*/

预备知识-动态内存    

#include <stdio.h>
#include <malloc.h>

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5}; //无法动态控制数组长度
    int i;

    int len;
    printf("Please input length:len = ");
    scanf("%d", &len);
    int * pArr = (int *)malloc(sizeof(int) * len);

    for (i = 0; i < len; ++i)
    {

        scanf("%d/n", &pArr[i]);
    }

    printf("--------------------------\n");

    for (i = 0; i < len; ++i)
    {
        printf("%d\n",*(pArr + i));
    }
    free(pArr);

    return 0;
}
/*
输出结果:
Please input length:len = 3
23 44 55
--------------------------
23
44
55
*/
时间: 2024-08-29 16:02:32

L1--数据结构简介与预备知识的相关文章

1.PMAC卡-简介和预备知识

PMAC卡是功能非常强大的运动控制卡,但是网上PMAC的教程很少,仅有的几个教程还是官网培训教程,罗列概念和记流水账,最不喜欢这样的教程.自己学习PMAC卡的时候走了许多弯路,刚好找完工作就写一下PMAC的相关教程,看完整个系列的教程,相信对于PMAC的使用是没有问题的,主要分为以下几个模块: 简介和预备知识 PMAC硬件 PMAC下位机编程 PMAC上位机编程 PMAC简介 PMAC基本上算是自动控制行业中功能最强大的运动控制卡了,虽然价格不菲,但是使用及其方便,功能也极其强大,怎么强大自己去

记数据结构--入门和预备知识

数据结构(一)--入门和预备知识 1. 概述 数据结构定义: 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中, 以及在此基础上为实现某个功能(如元素的CURD.排序等)而执行的相应操作,这个相应的操作也叫算法. 数据结构 = 元素的存储 + 元素的关系的存储算法 = 对数据存储的操作 算法: 算法就是:解决问题的方法和步骤 衡量算法有如下标准: 时间复杂度(程序要执行的次数,并非执行时间) 空间复杂度(算法执行过程中大概要占用的最大内存) 难易程度(可读

[转]预备知识—程序的内存分配

因为经典,所以转发. 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack)  —   由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 堆区(heap)   —   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回    收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static) —,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,

【转】关于LIS和一类可以用树状数组优化的DP 预备知识

原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html 预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推.例如斐波那契数列的递推求法可以不严谨地认为是DP.当然DP的状态也可以是二维/三维的,某一维的含义也不仅仅是指某个数列的第几项. 树状数组(BIT or fenwick tree):一种高效地动态维护一个序列并动态求取前缀和的数据结构.修改某个元素/求一次前缀和的

android金阳光自动化测试——学习历程:自动化预备知识上&amp;&amp;下

章节:自动化基础篇——自动化预备知识上&&下 网易云课堂: 上:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877113&courseId=712011 下:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877114&courseId=71

《软件可靠性方法》笔记(一)---第二章 预备知识

时间:2016.11.12: 地点:南京江宁实验室: 状态:迷茫的研一: 为什么会读到这本书?导师推荐的.可以说第一开始听到这本书名时完全是一脸蒙蔽,就像选本科毕设题目时是一样的...就是在上半年当老师告诉我他是做形式化的,我一度以为我特么的难道联系到自动化学院了?我可是一门心思向计算机的.后来直到暑假在家闲的发慌翻翻本科时候的软件课本书时,居然看到了一章讲形式化的...蜜汁尴尬,毕竟当年这门课最后我得了优.咳咳,扯远了.这本书还是蛮适合刚接触形式化的人看的,但是得有一定的数学功底(所以说我一开

《C++ Primer Plus》学习笔记 第1章 预备知识

第一章 预备知识C++在C语言的基础上添加了对"面向对象编程"的支持和对"泛型编程"的支持.类 —— 面向对象模板 —— 泛型编程1.1 C++简介1.2 C++简史1.3 可移植性和标准1.4 程序创建的技巧http://www.cnblogs.com/moonlightpoet/p/5611668.html1.5 总结

WPF学习08:MVVM 预备知识之COMMAND

WPF内建的COMMAND是GOF 提出的23种设计模式中,命令模式的实现. 本文是WPF学习07:MVVM 预备知识之数据绑定的后续,将说明实现COMMAND的三个重点:ICommand  CommandManager InputBindings COMMAND简介 一般情况我们应用设计如下,一个个控件的各类Handler直接关心了如何实现具体的应用逻辑. 借助COMMAND,我们将具体实现的应用逻辑放在COMMAND中实现,控件只需要绑定相应的COMMAND,而无需关心应用逻辑,从而实现界面

(连载)边喝咖啡边学Unity——第二章 预备知识体系

第二章 预备知识体系 --本章涉及空间数学.解析几何.线性代数.计算机图形学.算法.数据结构等众多基础学科.同上一章相比,虽然枯燥,但是绝不能称为废话之章,即使粗略的看一遍,也比直接跳过来的好,详细地读完,会让读者以后的开发之路走的更加平坦. 并且本章的知识不仅仅对您的Unity游戏开发有帮助,对于大部分软件开发人员都是大有作用的. 作为传统3D游戏编程来讲,需要运用到的知识面非常之广,涉及到的学科特别之多.而通常讲编程的书籍,会弱化数学知识,讲数学的书籍,会弱化编程方面的知识.这就是我在第一章