一、主要概述
主要操作看链接:数据结构的基本操作
在这基础上,进行优化:
1.前面主要存在的问题:
- 顺序表需要存储的数据记录条数大于设定值,导致空间资源不足。
- 需要存储数据记录条数小于或者远小于顺序表可存储数据记录条数,导致资源的浪费。
2.解决思路:
能够根据数据记录的条数开辟顺序表数据记录空间。动态数组空间实现:
动态数组的具体实现
- 1.存储动态数组首元素地址:data_t *data;
- 2.存储动态数组的元素个数:int size;
/* 构造可变数据记录的顺序表的数据类型 */
struct sqlist {
data_t *data; /* 顺序表首元素存储空间起始地址*/
int size; /* 顺序表可存储数据记录条数 */
int last; /* 顺序表中数据存储从序号为0位置开始存储,最后一条数据记录的存储位置使用last表示 */
};
二、操作改变部分
1.common.h:
typedef int data_t;//定义数据的类型为int型
#define MAXN 10
typedef struct sqlist{
data_t *data;//顺序表首元素存储空间起始地址
int nmemb;//顺序表可存储数据记录条数
int last;//顺序表中数据存储从序号为0位置开始存储,最后一条数据记录的存储位置使用last表示
} sqlist_t;
其他部分不变,后面相同;
2. sqlist.c
//创建顺序表
sqlist_t *CreateSqList(int mynmemb)
{
sqlist_t *list;//创建顺序表list
list = malloc(sizeof(sqlist_t));//分配空间
if(list == NULL)//判断表是否为空
return NULL;
memset(list,0,sizeof(sqlist_t));//初始化表
list->data = calloc(mynmemb,sizeof(data_t);//动态分配内存
list->nmemb = mynmemb;
list->last = -1;
return list;
}
判断表满:
//判断顺序表是否满
int isFullSqList(sqlist_t *list)
{
return (list->last == list->nmemb-1);
}
3.main.c
#include <stdio.h>
#include "common.h"
int main()
{
int i;
sqlist_t *list;
data_t mydata;
list = CreateSqList();
if (list == NULL)
return -1;
i = 20;
while(i) {
mydata.num = i;
sprintf(mydaya.name,"name%d",i);
mydata.score = i;
printf("insert %d - %d\n", i, InsertSqList(list, 0, i));
i--;
}
DisplaySqList(list);
DeleteSqList(list,4);
DisplaySqList(list);
.....
}
其他操作一样
三、顺序表特征
- 顺序表在初始化的时候,开辟固定大小的存储。实际存储过程中可能存在空间的不足和资源的浪费。
- 数据的增加和删除的时候,需要移动其它的数据元素,导致效率较低。
- 数据的查询和修改的时候,可以直接根据数据元素的序号直接访问,效率较高。