数据结构------顺序表(C/C++)

// 顺序表(静态分配空间)

#include <stdio.h>
#include "stdbool.h"    /* bool */
#include "stdlib.h"     /* malloc */
#include "string.h"     /* memset */

#define MAXSIZE 50
typedef int DataType;

// 定义结构体
typedef struct {
    DataType data[MAXSIZE];      // 数据域
    int length;
}SeqList;


void listInit(SeqList ** seq_p);
bool listInsert(SeqList * seq, int index, DataType c);
DataType listDelete(SeqList * seq, int index);
int getLocate(SeqList * seq, int value);
DataType getValue(SeqList *list, int value);
int length(SeqList * seq);
void printSeq(SeqList * seq);




int main() {

    SeqList* seqList;
    listInit(&seqList);         // 初始化线性表
    /** 初始化也可以直接写成:
     * SeqList seq;
     * SeqList* seqList = &seq;
     */

    listInsert(seqList, 1, 9);
    listInsert(seqList, 2, 10);
    listInsert(seqList, 3, 11);
    listInsert(seqList, 4, 12);

    printf("表长:%d\n", length(seqList));

    if(listDelete(seqList, 2)!=-1) {
        printf("删除第2个元素成功\n");
    }

    printf("获取第2个元素的值:%d\n", getValue(seqList, 2));
    printf("获取值为12的元素所在的位置:%d\n", getLocate(seqList, 12));

    printSeq(seqList);

    return 0;
}


/**
 * 打印顺序表
 * @param seq
 */
void printSeq(SeqList * seq) {
    printf("顺序表:");
    for (int i = 0; i < seq->length; ++i) {
        printf("%d", seq->data[i]);
        if(i != seq->length-1) {
            printf(" ===> ");
        }
    }
}


/**
 * 初始化顺序表
 * @return
 */
void listInit(SeqList ** seq_p) {
    // 为结构体分配空间
    *seq_p = (SeqList *) malloc(sizeof(SeqList));
    // 初始化
    (*seq_p)->length = 0;
    memset((*seq_p)->data, 0, MAXSIZE);
}


/**
 * 顺序表插入操作
 * @param seq
 * @param index 插入位置
 * @param num   插入值
 * @return
 */
bool listInsert(SeqList * seq, int index, DataType c) {

    // 判断插入位置是否有效,插入位置为 1 ~ length + 1 实际对应数组的下标为 0 ~ length
    if(index < 1 || index > seq->length + 1) {
        return false;
    }

    // 判断顺序表是否还有空间
    if(seq->length >= MAXSIZE) {
        return false;
    }

    // index后的元素往后移
    for (int i = seq->length; i >= index; --i) {
        seq->data[i] = seq->data[i - 1];
    }

    // 插入
    seq->data[index - 1] = c;
    seq->length++;

    return true;
}


/**
 * 删除第index个元素
 * @param seq
 * @param index
 * @return
 */
DataType listDelete(SeqList * seq, int index) {
    if(index < 1 || index > seq->length) {
        return -1;
    }

    int res = seq->data[index - 1];
    // i位置后的元素前移
    for (int i = index - 1; i < seq->length - 1; ++i) {
        seq->data[i] = seq->data[i + 1];
    }
    seq->length--;
    return res;
}


/**
 * 返回表长
 * @param seq
 * @return
 */
int length(SeqList * seq) {
    return seq->length;
}


/**
 * 按位查找, 获取第index个元素的值
 * @param list
 * @param index
 * @return
 */
DataType getValue(SeqList * seq, int index) {
    if(index < 1 || index > seq->length) {
        return -1;
    }
    return seq->data[index - 1];
}


/**
 * 按值查找
 * @param seq
 * @param value 待查找的值
 * @return
 */
int getLocate(SeqList * seq, int value) {
    for (int i = 0; i < seq->length; ++i) {
        if (seq->data[i] == value) {
            return i + 1;
        }
    }
    return -1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值