数据结构学前C语言的知识点

复习C语言

一、复习C语言指针

一、复习C语言指针

#include <stdio.h>
#include <stdlib.h>

int *p = &i;//等价于int *p; p=&i;p指向i,*p就是i变量本身


/*如何通过被调函数修改主调函数中普通变量的值*/
void f(int *p){/*2.形参为相同变量类型的指针变量*/
//不是定义了名字叫做*i的形参,而是定义了一个形参,该形参名字叫做p,他的类型为int *
 *p=100;/*3.在被调函数中通过 *形参变量名 的方式就可以修改主函数中变量的值*/
}
int main()
{
   int i=9;
   f(&i);/*1.实参为相关变量的地址*/
   printf("i=%d\n",i);
    return 0;
}


/*指针和数组*/
int main(){
int a[5]={1,2,3,4,5};//a是一个指针常量,a存放的是第一个元素的地址,它的值不能被改变,指向的是数组的第一个元素
a[3] == *(3+a);//元素和指针的关系a[i]==*(a+i)
printf("%d\n",a[3] == *(3+a));
printf("%p\n",a+1);
printf("%p\n",a+2);//表明地址是连续的,占4个字节
printf("%d\n",*a+3);//*a+3等价于a[0]+3
return 0;
}



/*如何通过被调函数修改主调函数中一维数组的内容*/
/*1.存放数组首元素的指针变量*/
/*2.存放数组元素长度的整型变量*/
void show_array(int * p,int len){
p[0]=-1;//p[0] == *p
p[2]=-1;//p[2] == *(p+2) ==*(a+2) == a[2]   //p[i]就是主函数的a[i]
for(int i=0;i<len;++i){
    printf("%d\n",p[i]);
}
}
int  main(){
 int a[5]={1,2,3,4,5};
 show_array(a,5);//a等价于&a[0],&a[0]本身就是int *类型
 printf("%d\n",a[0]);
 printf("%d\n",a[2]);
 return 0;
}

一、复习C语言结构体

一、复习C语言结构体

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
    int sid;
    char name[200];
    int age;
    //结构体变量不能加减乘除,但是可以相互赋值
};//分号不可省
int main()
{
    struct student st= {1000,"zhang",20};
    st.sid=99;第一种方式
    struct student *pst;
    pst = &st;
    pst->sid = 99; //第二种:pst->sid 等价于(*pst).sid 也就等价于st.sid;
   //  pst所指向的结构体变量中的sid这个成员
    return 0;
}



 //普通结构体变量和指针结构体变量作为函数传参的问题
void g(struct student st)
{
    printf("%d %s %d\n",st.sid,st.name,st.age);
}
//耗时
void f(struct student *pst)
{
    (*pst).sid = 99;
    strcpy(pst->name,"zhang");
    pst->age = 22;
    printf("%d %s %d\n",pst->sid,pst->name,pst->age);
}
int main()
{
    struct student st;
    f(&st);
 //   g(st);
}

一、复习C语言malloc动态分配内存

一、复习C语言malloc动态分配内存

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

int main()
{
    int len;
    printf("输入你需要分配的数组的长度:len=");
    scanf("%d",&len);
    int *pArr = (int *)malloc(sizeof(int) * len);//分配了20个字节 *是乘号
    //malloc函数能且只能返回第一个字节的地址
    //干地址转化成实际意义的地址就必须在malloc前面加(数据类型 *)
    //int *告诉编译器把第一个字节的地址当做整型的地址
    //pArr指向前4个字节 pArr+1表示指向后4个字节
//    *pArr = 4;//类似于a[0]=4
//    pArr[1] = 10;//类似于a[1]=10;
//    printf("%d %d\n",*pArr,pArr[1]);

    //我们可以把pArr当做一个普通数组来使用
    for(int i=0;i<len;++i){
        scanf("%d",&pArr[i]);
    }
    for(int i=0;i<len;++i){
        printf("%d\n",*(pArr+i));
    }
    free(pArr);//把pArr所代表的动态分配的20个字节的内存释放
    return 0;
}

数据结构

二、数据结构

数据结构 = 个体的存储 + 个体的关系存储
算法 = 对存储数据的操作

模块一:线性结构【把所有的结点用一根直线穿起来】

连续存储【数组】

离散存储【链表】
①定义:n个结点离散分配,彼此通过指针相连,每个节点只有一个前驱节点和后续节点,首节点没有前驱节点,尾结点没有后续节点
②专业术语:
首节点:第一个有效节点
尾结点:最后一个有效节点
头结点:第一个有效节点之前的那个节点,头节点并不存放有效数据,加头结点的目的主要是为了方便对链表的操作
头指针:指向头结点的指针变量
尾指针:指向尾结点的指针变量
③确定一个链表需要几个参数:
只需要一个参数----头指针 因为我们通过头指针可以推算出链表的其他所有参数
④分类:
单链表、双链表、循环链表、非循环链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值