【每日一题C】malloc和realloc的使用

知识整理:

1、malloc:在堆区中动态申请内存

2、calloc:在堆区中动态申请内存并清零

3、realloc:重新申请内存

4、free:释放内存

5、通过cppreference.com网站学习C语言编程知识

6、程序=算法+数据结构

7、数据结构=结构定义+结构操作

8、顺序表:线性表的顺序存储,如数组

代码展示:

#include<stdio.h>
#include<stdlib.h>
//线性表的顺序存储,实现增删功能
//结构体
typedef struct node{
    int *data;
    int size,cap;//元素数量、容量
}Node;
//初始化结构体
Node *init_Node(int x){
    Node *p=(Node *)malloc(sizeof(Node));
    p->data=(int *)malloc(sizeof(int)*x);
    p->size=0;//元素数量为0
    p->cap=x;//初始容量大小为传参x
    return p;
}
//删除结构体
void delete_Node(Node *p){
    free(p->data);//先释放该空间避免造成内存泄露风险
    free(p);
}
//插入元素
int insert(Node *p,int ind,int x){//ind是待插入的位置
    if(p->size<ind)
      return 1;//插入的位置不合理
    if(p->size==p->cap)//空间满了
      p->data=(int *)realloc(p->data, sizeof(int)*p->cap);//扩容
    for(int i=p->size-1;i>=ind;i--)
        p->data[i+1]=p->data[i];
    p->data[ind]=x;
    p->size++;//元素加一
    return 0;
}
//删除元素
int delete(Node *p,int ind){
    if(p->size<=ind)
      return 1;//删除位置不合理
    for(int i=ind+1;i<p->size;i++)
      p->data[i-1]=p->data[i];
    p->size--;//元素减一
    return 0;
}
//打印结点
void show(Node *p){
    printf("容量:%d,元素个数:%d\n",p->cap,p->size);
    for(int i=0;i<p->size;i++){
        printf("%d ",p->data[i]);
    }
    printf("\n");
}
int main(){
    int n,m;
    printf("请输入增删操作总次数和结点初始容量: ");
    scanf("%d%d",&n,&m);
    Node *N=init_Node(m);//开一个初始容量为m的结点N
    show(N);
    for(int i=0;i<n;i++){
        printf("**************************\n");
        int j;
        printf("请输入选择符(增:1;删:0): ");
        scanf("%d",&j);
        if(j==0){//删除元素
            int ind;
            printf("请输入删除元素的位置:");
            scanf("%d",&ind);
            if(delete(N,ind))
              printf("删除位置不合理!\n");
        }
        if(j){//删除元素
            int ind,x;
            printf("请输入插入的元素和位置:");
            scanf("%d%d",&x,&ind);
            if(insert(N,ind,x))
              printf("插入位置不合理!\n");
        }
        show(N);
    }
    delete_Node(N);
    return 0;
}

运行结果示例:

请输入增删操作总次数和结点初始容量: 5 2
容量:2,元素个数:0

**************************
请输入选择符(增:1;删:0): 1
请输入插入的元素和位置:10 1
插入位置不合理!
容量:2,元素个数:0

**************************
请输入选择符(增:1;删:0): 1
请输入插入的元素和位置:10 0
容量:2,元素个数:1
10 
**************************
请输入选择符(增:1;删:0): 1
请输入插入的元素和位置:8 0
容量:2,元素个数:2
8 10 
**************************
请输入选择符(增:1;删:0): 1
请输入插入的元素和位置:9 1
容量:2,元素个数:3
8 9 10 
**************************
请输入选择符(增:1;删:0): 0
请输入删除元素的位置:2
容量:2,元素个数:2
8 9 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林月明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值