一、
1、顺序表的优点:
(1)存储空间连续,方便随时访问;
(2)结构简单,易于理解;
(3)易于尾插或尾删和修改;
2、顺序表的缺点:
(1)顺序存储空间容易溢出,不便扩充;
(2)插入和删除必须移动大量元素;
二、顺序表的定义:
(1)数组静态分配(一开始就定下大小):
#define size 10
typedef struct{
char isbn[20];
char name[20];
float price;
}Book;
typedef struct{
Book elem[size];
int length;//当前长度
}sqlist;
(2)数组动态分配:
#define size 10
typedef struct{
char isbn[20];
char name[20];
float price;
}Book;
typedef struct{
Book *elem;
int length;//当前长度
}sqlist;
此时就要:
sqlist L;
L.elem=(Book*)malloc(sizeof(Book)*size);
三、涉及的函数
(1)构造一个空的线性表 ;
int Init_list(sqlist *L)
{
L->elem = (Book *)malloc(sizeof(Book) * size);
if (!L->elem) {
exit(-1);
}
L->length = 0;
return 1;
}
(2)销毁线性表;
void Destroy_list(sqlist *L)
{
if (L->elem) {
free(L->elem);
}
}
(3)将线性表置空
void Clear_list(sqlist *L)
{
L->elem = 0;
}
(4)返回线性表中的元素个数(长度)
int List_length(sqlist *L)
{
return (L->length);
}
(5)判断线性表是否为空,若是返回1,不是返回0
int List_empty(sqlist L)
{
if(L.elem==0)
{
return 1;
}else
{
return 0;
}
}
(6)用e返回线性表L中的第i个元素的值(1<=i<=Listlength(L))成功返回1,失败返回0
int Get_elem(sqlist *L, int i, Book *e)
{
if (i < 1 || i > L->length) {
return 0;
}
*e = L->elem[i - 1];
return 1;
}
(7)查找与指定值相同的e的位置,若找到,返回位置序号,否则返回0
int Locate_elem(sqlist *L, Book e)
{
int i;
for (i = 0; i < L->length; i++) {
if (memcmp(&L->elem[i], &e,
strlen(e.isbn) + strlen(e.name) + sizeof(e.price)) == 0) {
return (i + 1);
}
}
return 0;
}
(8)在第i个位置插入数据元素e,L的长度加一 ,成功返回1,失败返回0
int List_insert(sqlist *L, int i, Book e)
{
if (i < 1 || i > L->length + 1 || L->length == size) {
return 0;
}
int j;
for (j = L->length-1; j >= i-1; j--) {
L->elem[j+1] = L->elem[j];
}
L->elem[i - 1] = e;
L->length++;
return 1;
}
(9)删除第i个数据元素,L长度减一 ,成功返回1,失败返回0
int List_delete(sqlist *L, int i)
{
if (i < 1 || i > L->length) {
return 0;
}
int j;
for (j = i; j < L->length-1; j++) {
L->elem[j - 1] = L->elem[j];
}
L->length--;
return 1;
}
注:(1)假设线性表中每个元素有占q个存储单元,第i个数据元素的存储位置和第i+1个数据元素的存储位置之间满足关系:
即:
eg:如果每个元素占8个存储单元, 的存储位置是2022,则 的存储位置是2030;