线性表之顺序结构
线性表的顺序存储是指⽤⼀组地址连续的存储单元依次存储线性表中各元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采⽤顺序存储结构存储的线性表通常简称为顺序表。
顺序存储的线性表的特点:
线性表的逻辑顺序与物理顺序⼀致;
数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
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 ListTraver(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)); ListTraver(&L);
printf("delete student id=%d\n",3);
ListDelete(&L, 3);
ListTraver(&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 ListTraver(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");