顺序表的C语言实现

​ 顺序表是线性表的顺序表示,不仅其逻辑结构上各元素之间是连续的,在存储结构上,元素结点之间也是相邻的,其结构和数组相似,故一般使用数组对其进行描述。具体概念可以参考这篇文章

​ 线性表的ADT如下所示,我们使用顺序存储结构,来实现其中的基本操作。

ADT List {
  数据对象:D={ai|ai ∈ Elemset,i=1,2,…,n,n≥0}
	数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}
	基本操作:
    InitList(&L)
    	初始化操作,建立一个空的线性表L。
    DistroyList(&L)
    	初始条件:线性表L已存在
    	操作结果:销毁线性表,释放其空间。
    ClearList(&L)
    	初始条件:线性表L已存在
    	操作结果:将线性表清空。
    ListEmpty(L)
    	初始条件:线性表L已存在
    	操作结果:若线性表为空,返回true,否则返回false。	
    ListLength(L)
    	初始条件:线性表L已存在
    	操作结果:返回L中数据元素的个数。	
    GetElem(L, i, &e)
    	初始条件:线性表L已存在
    	操作结果:用e返回线性表L中的第i个位置元素的值。
    LocateElem(L, e)	    
    	初始条件:线性表L已存在
    	操作结果:返回线性表L中第一个与给定值e相等的数据元素的位置。若不存在这样的元素,则返回0。
    ListInsert(&L, i, e)
    	初始条件:线性表L已存在
    	操作结果:在线性表L中的第i个位置插入新元素e,L的长度加1。
    ListDelete(&L, i, &e)
    	初始条件:线性表L已存在
    	操作结果:删除线性表L中第i个位置元素,并用e返回其值,L的长度减1。
    DisplayList(L)
    	初始条件:线性表L已存在
    	操作结果:输出L中的所有数据元素。
}

​ 具体代码如下:

//
//  main.c
//  SqList
//
//  Created by 李子树 on 2021/9/13.
//  Copyright © 2021 李子树. All rights reserved.
//

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define MAX_LENGTH 10

typedef struct{
    int data[MAX_LENGTH];
    int length;
}SqList;

void InitList(SqList *L){
    printf("正在进行列表初始化:\n");
    L->length = 0;
    printf("列表初始化完成!\n");
}

void destroyList(SqList *L){
    free(L);
    if(L){
        printf("顺序表空间释放成功!\n");
    }
}

void clearList(SqList *L){
    printf("清空顺序表中的所有元素!\n");
    L->length = 0;
}

/**
 顺序表是否为空
 */
bool ListEmpty(SqList L){
    if(L.length == 0) return true;
    return false;
}

/**
 获取顺序表的长度
 */
int ListLength(SqList L){
    return L.length;
}

/**
 i的取值范围为[0-length-1]
 */
void GetElem(SqList L, int i, int *e){
    if(i<0 || i>L.length-1){
        printf("取值的坐标异常,超出范围!\n");
        return;
    }
    *e = L.data[i];
}

/**
 查找第一个值为e的元素,并返回其位序
 */
int LocateElem(SqList L, int e){
    int i;
    for (i=0; i<L.length; i++) {
        if(L.data[i] == e){
            return i;
        }
    }
    return -1;
}

/**
 在指定位置上插入节点
 */
bool ListInsert(SqList *L, int i, int e){
    int j;
    if(i<0 || i > L->length || L->length == MAX_LENGTH){
        printf("插入元素%d位置异常或者队列已满!\n", e);
        return false;
    }
    //从后往前,逐个将元素往后移动一位
    for (j = L->length-1; j >= i; j--) {
        L->data[j] = L->data[j-1];
    }
    L->data[i] = e;
    //表的长度自增1
    ++(L->length);
    return true;
}

/**
删除指定位置上的节点
*/
bool ListDelete(SqList *L, int i, int *e){
    int j;
    if(i<0 || i >= L->length){
        printf("删除节点索引异常,超出范围!\n");
        return false;
    }
    //将指定位置的元素存入e中
    *e = L->data[i];
    //从前往后,逐个将元素往前移动一位
    for (j = i; j < L->length; j++) {
        L->data[j] = L->data[j+1];
    }
    //表的长度自增1
    --(L->length);
    return true;
}

void DisplayList(SqList L){
    printf("数组中——的值:");
    for(int i=0; i<L.length; i++){
        printf("%d ", L.data[i]);
    }
    printf("\n");
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    SqList LA;
    int e;
    InitList(&LA);
    //手动插入一个节点,后续完善所有代码后,通过ListInsert插入元素
    int a[] = {1, 3, 5, 7, 9};
    for(int i=0; i<sizeof(a)/sizeof(int); i++){
        ListInsert(&LA, i, a[i]);
    }
    //LA.data[0] = 5;
    //LA.length = 1;
    DisplayList(LA);
    GetElem(LA, 2, &e);
    printf("取到的元素节点为:%d\n", e);
    ListDelete(&LA, 3, &e);
    printf("删除的元素节点为:%d\n", e);
    DisplayList(LA);
    int eleIndex = LocateElem(LA, 5);
    printf("元素节点%d的位序为:%d\n", 5, eleIndex);
    //测试表是否为空,0表示非空,1表示表中无元素
    bool result = ListEmpty(LA);
    int length = ListLength(LA);
    printf("数组的长度为:%d,是否为空:%d \n", length, result);
    return 0;
}

参考资料:

1.菜鸟教程–C 语言教程

2.数据结构中的C语言编程基础

3.数据结构之线性表

4.数据结构考研大纲


​ 又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主根据自身理解与对考研资料进行的整理,仅作为参考,大佬有什么问题,可以评论区留言,如果有什么错误,还请批评指正。

​ 本专栏为数据结构知识,喜欢的话可以持续关注,如果本文对你有所帮助,还请还请点赞、评论加关注

​ 有任何疑问,可以评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李子树_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值