数据结构与算法
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;