顺序表的顺序存储及操作

线性表:具有相同特性的数据元素组成的有限序列。顾名思义,线性表有以下特征:
1.线性表有且只有一个开始结点,且这个开始节点没有前驱结点;
2.线性表有且只有一个末尾结点,且这个末尾结点没有后继结点;
3.其他结点有一个前驱结点和一个后继结点;
代码如下:

  1. seq_table.h
#ifndef  _SEQ_TABLE_H
#define _SEQ_TABLE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SEQ_ERR (-1)
#define SEQ_SUCCESS 0
/* 本次测试以char类型数据为例 */
#define DATA_TYPE_IS_CHAR

#if defined DATA_TYPE_IS_CHAR
typedef  char DataType;
#elif defined DATA_TYPE_IS_INT
typedef int DataType;
#elif defined DATA_TYPE_IS_FLOAT
typedef float DataType;
#endif
typedef struct seq_table_data{
    int capacity; /*顺序表的容量*/
    int length; /* 顺序表的实际长度 */
    DataType *data; /* 顺序表的数据 */
}*PSeqTable, SeqTable;

/*  初始化一个顺序表 */
PSeqTable InitSeqTable(int capacity);
/* 获取一个顺序表的容量 */
int GetSeqTableCapacity(PSeqTable seqTable);
/* 获取一个顺序表的当前长度 */
int GetSeqTableLength(PSeqTable seqTable);
/* 判断一个顺序表是否为空,若为空返回1,若不为空返回0 */
int SeqTableIsEmpty(PSeqTable seqTable);
/* 获取顺序表中的元素(参数为元素的位置) */
DataType GetSeqTableElement(PSeqTable seqTable, int index);
/* 向顺序表中插入一个元素(参数分别为顺序表、元素值和元素的位置) */
int InsertIntoSeqTable(PSeqTable seqTable, DataType data, int index);
/* 从顺序表中删除一个元素(参数分别为元素值和元素的位置) */
int DeleteFromSeqTable(PSeqTable seqTable, int index);
/* 遍历顺序表 */
void DisplaySeqTable(PSeqTable seqTable);
/* 将一个顺序表中的元素清空并置空 */
void ClearSeqTable(PSeqTable seqTable);
#endif

2.seq_table.c

#include "seq_table.h"

PSeqTable InitSeqTable(int capacity)
{
    int option = 1;
    PSeqTable seqTable = (PSeqTable)malloc(sizeof(SeqTable));
    if(seqTable == NULL || capacity <= 0) {
        perror("create sequence table error or invalid input.");
        return (PSeqTable)SEQ_ERR;
    }

    seqTable->capacity = capacity;
    seqTable->length = 0;
    seqTable->data = (DataType *)malloc(capacity * sizeof(DataType));
    if(seqTable->data == NULL) {
        perror("create data of sequece table.");
        free(seqTable);
        return (PSeqTable)SEQ_ERR;
    }
    memset(seqTable->data, 0, sizeof(DataType) * capacity);
    int index = 0;
    while(index<capacity) {
        if(option == 1) {
            switch (index) {
                        case 0:
                            printf("Please input the %dst data\n", index + 1);
                            break;
                        case 1:
                            printf("Please input the %dnd data\n", index + 1);
                            break;
                        case 2:
                            printf("Please input the %drd data\n", index + 1);
                            break;
                        default:
                            printf("Please input the %dth data\n", index + 1);
                            break;
            }
        #if defined DATA_TYPE_IS_CHAR
            seqTable->data[index] = getchar();
        #elif defined DATA_TYPE_IS_INT
            scanf("%d", &seqTable->data[index]);
        #elif defined DATA_TYPE_IS_FLOAT
            scanf("%f",&seqTable->data[index]);
        #endif
        #if defined DATA_TYPE_IS_CHAR
            while(getchar() != '\n');
        #endif
            index++;
            seqTable->length++;
            printf("select 1/0 to continue or quit.");
            scanf("%d", &option);
        #if defined DATA_TYPE_IS_CHAR
            while(getchar() != '\n');
        #endif
        } else {
            break;
        }
    }   
    return seqTable;
}

int GetSeqTableCapacity(PSeqTable seqTable)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return SEQ_ERR;
    }
    return seqTable->capacity;
}

int GetSeqTableLength(PSeqTable seqTable)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return SEQ_ERR;
    }
    return seqTable->length;
}

int SeqTableIsEmpty(PSeqTable seqTable)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return SEQ_ERR;
    }

    return (seqTable->length == 0);
}

DataType GetSeqTableElement(PSeqTable seqTable, int index)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return (DataType)SEQ_ERR;
    }
    if((index < 0) || (index > seqTable->length - 1)) {
        perror("invalid index number.");
        return (DataType)SEQ_ERR;
    }
    return seqTable->data[index];
}

int InsertIntoSeqTable(PSeqTable seqTable, DataType data, int index)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return (DataType)SEQ_ERR;
    }
    if((index < 0) || (index > seqTable->capacity - 1)) {
        perror("invalid index number.");
        return (DataType)SEQ_ERR;
    }
    for(int i=seqTable->length-1; i>=index; i--) {
        seqTable->data[i+1] = seqTable->data[i];
    }
    seqTable->data[index] = data;
    seqTable->length++;
    return SEQ_SUCCESS;
}

int DeleteFromSeqTable(PSeqTable seqTable, int index)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return SEQ_ERR;
    }
    if((index < 0) || (index > seqTable->length - 1)) {
        perror("invalid index number.");
        return SEQ_ERR;
    }
    for(int i=index; i<seqTable->length; i++) {
        seqTable->data[i] = seqTable->data[i+1];
    }
    seqTable->length--;

    return SEQ_SUCCESS;
}

void DisplaySeqTable(PSeqTable seqTable)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return ;
    }

    for(int i=0; i<seqTable->length; i++) {

    #if defined DATA_TYPE_IS_CHAR
        printf("%c ", seqTable->data[i]);
    #elif defined DATA_TYPE_IS_INT
        printf("%d  ", seqTable->data[i]);
    #elif defined DATA_TYPE_IS_FLOAT
        printf("%f  ", seqTable->data[i]);
    #endif

    }
    printf("\n");
    return ;
}
void ClearSeqTable(PSeqTable seqTable)
{
    if(seqTable == NULL) {
        perror("sequence table is null.");
        return ;
    }
    free(seqTable->data);
    free(seqTable);
    printf("clear sequece table completed.\n");
}

3.main.c

#include "seq_table.c"

int main(void)
{
    PSeqTable mySeqTable = InitSeqTable(10);
    DisplaySeqTable(mySeqTable);
    InsertIntoSeqTable(mySeqTable, 'D', 2);
    printf("After insert.\n");
    DisplaySeqTable(mySeqTable);
    DeleteFromSeqTable(mySeqTable, 1);
    printf("After delete.\n");
    DisplaySeqTable(mySeqTable);
    printf("len of seqTable is:%d, capacity is :%d\n", GetSeqTableLength(mySeqTable), GetSeqTableCapacity(mySeqTable));
    printf("Is seqTable empty?[%s]\n", SeqTableIsEmpty(mySeqTable)?"yes":"no");
    ClearSeqTable(mySeqTable);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

存墨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值