线性表之顺序结构

    线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中各元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。 
    顺序存储的线性表的特点: 

  • 线性表的逻辑顺序与物理顺序一致; 
  • 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。

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

                                                更多文章,欢迎关注公众号~

                                                   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值