线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中各元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。
顺序存储的线性表的特点:
- 线性表的逻辑顺序与物理顺序一致;
- 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
1. 定义结构体
#define MAXSIZE 45
typedef struct {
int id;
char name[64];
int age;
}Student;
//顺序表结构
typedef struct
{
Student info[MAXSIZE];
int len;
}SqList;
2. 初始化顺序表
//初始化顺序表
void InitList(SqList *L)
{
L->len = 0;
}
3. 判断顺序表是否空
//判空
int ListEmpty(SqList *L)
{
return (L->len == 0);
}
4. 判断顺序表是否满
//判满
int ListFull(SqList *L)
{
return (L->len == MAXSIZE);
}
5. 清空顺序表
//清空顺序表
void ClearList(SqList *L)
{
L->len = 0;
}
6. 返回顺序表长度
//获取顺序表长度
int ListLength(SqList *L)
{
return L->len;
}
7. 获取指定id的元素
//获取指定id的元素
int GetListElem(SqList *L,int id,Student *e)
{
int i;
if(ListEmpty(L))
return -1;
for(i=0; i<L->len; i++) {
if(L->info[i].id == id)
break;
}
if(i >= L->len)
return -1;
*e = L->info[i];
return 0;
}
8. 删除指定id的元素
//删除指定id的元素
int ListDelete(SqList *L,int id)
{
int i,k;
if (ListEmpty(L))
return -1;
for(i=0; i<L->len; i++) {
if(L->info[i].id == id)
break;
}
if(i >= L->len)
return -1;
//删除的不是最后位置
if (i < (L->len-1)){
for(k=i; k<L->len; k++)
L->info[k] = L->info[k+1];//将删除位置后继元素前移
}
L->len--;
return 0;
}
9. 遍历顺序表
void ListTraverse(SqList *L)
{
int i;
for(i=0; i<L->len; i++)
printf("id:%d\tname:%s\tage:%d\n",L->info[i].id,L->info[i].name,L->info[i].age);
printf("\n");
}
10. 追加数据
//追加数据
int ListAppend(SqList *L, Student *e)
{
if(ListFull(L))
return -1;
L->info[L->len++] = *e;
return 0;
}
11. 测试程序
int main()
{
SqList L;
Student stu[5] = {
{1,"zhangsan",20},
{2,"lisi",21},
{3,"wangwu",19},
{4,"liliu",22},
{5,"qiba",21}
};
InitList(&L);
int i;
for(i=0; i<5; i++)
ListAppend(&L, &stu[i]);
printf("List len=%d\n",ListLength(&L));
ListTraverse(&L);
printf("delete student id=%d\n",3);
ListDelete(&L, 3);
ListTraverse(&L);
return 0;
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 45
typedef struct {
int id;
char name[64];
int age;
}Student;
//顺序表结构
typedef struct
{
Student info[MAXSIZE];
int len;
}SqList;
//初始化顺序表
void InitList(SqList *L)
{
L->len = 0;
}
//判空
int ListEmpty(SqList *L)
{
return (L->len == 0);
}
//判满
int ListFull(SqList *L)
{
return (L->len == MAXSIZE);
}
//清空顺序表
void ClearList(SqList *L)
{
L->len = 0;
}
//获取顺序表长度
int ListLength(SqList *L)
{
return L->len;
}
//获取指定id的元素
int GetListElem(SqList *L,int id,Student *e)
{
int i;
if(ListEmpty(L))
return -1;
for(i=0; i<L->len; i++) {
if(L->info[i].id == id)
break;
}
if(i >= L->len)
return -1;
*e = L->info[i];
return 0;
}
//删除指定id的元素
int ListDelete(SqList *L,int id)
{
int i,k;
if (ListEmpty(L))
return -1;
for(i=0; i<L->len; i++) {
if(L->info[i].id == id)
break;
}
if(i >= L->len)
return -1;
//删除的不是最后位置
if (i < (L->len-1)){
for(k=i; k<L->len; k++)
L->info[k] = L->info[k+1];//将删除位置后继元素前移
}
L->len--;
return 0;
}
void ListTraverse(SqList *L)
{
int i;
for(i=0; i<L->len; i++)
printf("id:%d\tname:%s\tage:%d\n",L->info[i].id,L->info[i].name,L->info[i].age);
printf("\n");
}
int ListAppend(SqList *L, Student *e)
{
if(ListFull(L))
return -1;
L->info[L->len++] = *e;
return 0;
}
int main()
{
SqList L;
Student stu[5] = {
{1,"zhangsan",20},
{2,"lisi",21},
{3,"wangwu",19},
{4,"liliu",22},
{5,"qiba",21}
};
InitList(&L);
int i;
for(i=0; i<5; i++)
ListAppend(&L, &stu[i]);
printf("List len=%d\n",ListLength(&L));
ListTraverse(&L);
printf("delete student id=%d\n",3);
ListDelete(&L, 3);
ListTraverse(&L);
return 0;
}
运行结果:
xzkj@xzkj:~/temp$ ./test
List len=5
id:1 name:zhangsan age:20
id:2 name:lisi age:21
id:3 name:wangwu age:19
id:4 name:liliu age:22
id:5 name:qiba age:21
delete student id=3
id:1 name:zhangsan age:20
id:2 name:lisi age:21
id:4 name:liliu age:22
id:5 name:qiba age:21
更多文章,欢迎关注公众号~