【无标题】

本文介绍了在C语言中如何建立和销毁顺序表。重点强调了销毁顺序表时,不仅要将长度设为0,还需将元素指针设置为NULL,以确保内存正确释放并避免悬挂指针的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构与算法

1.顺序表的建立

#include <stdio.h>
#include <stdlib.h>
#define  LIST_INIT_SIZE  3
//定义图书表的线性表〃
typedef  struct 
{   char  nu[20];//图书编号
    char  name[20];//图书名称
    float  price;//图书价格
    /* data */
}book;
typedef struct 
{   book *elem;//基地址,结构体指针,指向book结构体
    int length;//当前线性表的长度
    /* data */
}SqList;
//初始化线性表
int InitList(SqList *L){
    L->elem=(book *)malloc(sizeof(book)*LIST_INIT_SIZE);
    if(!L->elem){
        return 0;
    }
    printf("初始化成功\n");
    L->length=0;
    return  1;

    
}
//向线性表中存放数据元素
int  DListData(SqList *L){//第一次得到空的线性表
    if(!L->elem){
        printf("已经销毁,出错\n");
        return 0;
    }
    int i;
    for(i=0;i<LIST_INIT_SIZE;i++){
    // char  nu[20];//图书编号
    // char  name[20];//图书名称
    // float price;//图书价格
        printf("请输入第%d本图书编号:\n",i+1);
        scanf_s("%s",L->elem[i].nu,20);
        printf("请输入第%d本图书名称:\n",i+1);
        scanf_s("%s",L->elem[i].name,20);
        printf("请输入第%d本图书价格:\n",i+1);
        scanf_s("%f",&L->elem[i].price);
        L->length++;
    }
    printf("输出每本图书信息\n");
    for (i = 0; i <LIST_INIT_SIZE; i++)
    {    printf("%s--",L->elem[i].nu);
         printf("%s--",L->elem[i].name);
         printf("%.2f\n",L->elem[i].price);
    }
    return 1;
}
//销毁线性表
void  DestroyList(SqList *L){
    if(L->elem){
        L->length=0;
        free (L->elem);
        L->elem=NULL;
        printf("销毁成功\n");
    }else{
        printf("已经销毁\n");
    }
}
//获取线性表的长度
void  GetListLength(SqList *L){
   printf("线性表的长度为:%d\n",L->length);
}
//获取i位置的值
book*  GetElem(SqList *L,int  i,book *e){
    if(i<1||i>L->length){
        printf("ERROR");
    }
    else{
         e=L->elem+i-1;
    }
}
int main()
{   SqList  SqList;
    int  i,n;
    printf("-------------------------欢迎进入图书管理系统-------------------------\n");
    //printf("1.初始化线性表---2.存储数据元素---3.销毁线性表---
    //4.获取线性表的长度---5.获取第n个线性表元素的值---输入-1退出系统\n");
    printf("-------------------------1.初始化线性表-------------------------------\n");
    printf("-------------------------2.存储数据元素-------------------------------\n");
    printf("-------------------------3.销毁线性表---------------------------------\n");
    printf("-------------------------4.获取线性表的长度----------------------------\n");
    printf("-------------------------5.获取第n个线性表元素的值----------------------\n");
    printf("-------------------------tips:输入-1退出系统---------------------------\n");
    while (1)
    {
    int  s;
    scanf_s("%d",&s);
    switch (s)
    {
    case 1:InitList(&SqList);break;//初始化
    case 2:DListData(&SqList);break;//存取
    case 3:DestroyList(&SqList);break;//销毁
    case 4:GetListLength(&SqList);break;
    case 5:
    printf("请输入要取的第几个线性表元素:\n");
    scanf_s("%d",&n);
    book *e;
    e=GetElem(&SqList,n,e);
    printf("第%d个顺序表元素的值为:\n",n);
    printf("%s--",e->nu);
    printf("%s--",e->name);
    printf("%.2f\n",e->price);
    break;//获取
    default:
        break;
    }
    //printf("1.初始化线性表---2.存储数据元素---3.销毁线性表---4.获取线性表的长度---5.输入-1退出系统\n");
    printf("-------------------------1.初始化线性表-------------------------------\n");
    printf("-------------------------2.存储数据元素-------------------------------\n");
    printf("-------------------------3.销毁线性表---------------------------------\n");
    printf("-------------------------4.获取线性表的长度----------------------------\n");
    printf("-------------------------5.获取第n个线性表元素的值----------------------\n");
    printf("-------------------------tips:输入-1退出系统---------------------------\n");
    if(s==-1){
        printf("退出系统成功\n");
        break;
    }
        
    }
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeZfBKSf-1648645494359)(C:\Users\28974\AppData\Roaming\Typora\typora-user-images\image-20220330205123715.png)]

总结:销毁顺序表时:

L->length=0;

free (L->elem);

​ L->elem=NULL;

必须让L->elem指向空,否则不会达到预期的效果,L->elem返回值不是空

free释放的是指针所指的内存空间,即将该内存空间归还给了操作系统。
但free之后,指针仍然存在,指针指向也不变,指针的内容仍存在且不变。

所以必须要L->elem=NULL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值