数据结构与算法---复习:线性表(顺序表实现)

数据结构与算法—复习:线性表(顺序表实现)

代码用作复习记录,不够规范,欢迎批评指正。

/**
 * 程序说明:线性表的顺序实现
 * 1.创建空线性表
 * 2.在list的位置p之前插入一个元素
 * 3.在list的位置p之后插入一个元素
 * 4.删除一个x值的元素
 * 5.在list删除位置为p的元素,并返回成功与否的标志
 * 6.在list中查找值为x的元素的位置
 * 7.判断线性表是否为空
 * 8.线性表初始化
 */
#include <stdio.h>
#include <malloc.h>

/**
 * 线性表结构定义
 */
struct SeqList{
    int MAXNUM; //表明线性表最大长度
    int n;  //表明线性表当前存储元素个数
    int* vals;  // DataType* X;
};
typedef struct SeqList * PSeqList; //定义一个指向SeqList的指针类型

/**
 * 1.创建一个空的线性表
 * @param m 线性表长度
 * @return
 */
PSeqList createNullList_Seq(int m){
    PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
    if(palist != NULL){
        palist->vals = (int*)malloc(sizeof(int) * m);
        if(palist->vals){
            palist->n = 0;
            palist->MAXNUM = m;
            return palist;
        } else{
            free(palist);
        }
    }
    printf("创建线性表时分配空间失败\n");
    return NULL;
}

/**
 * 2.判断线性表是否为空
 * @param palist
 * @return
 */
int isNullList_Seq(PSeqList palist){
     if(palist->n == 0)
         return -1;
     else
         return 0;
}

/**
 * 3.输入数据,找出该数据位于线性表的下标
 * @param palist
 * @param x
 * @return
 */
int locate_seq(PSeqList palist,int x){
    if(isNullList_Seq(palist))
        return -1;
    for(int i=0;i<palist->n;i++)
    {
        if(palist->vals[i] == x)
            return i;
    }
    return -1;
}

/**
 * 4.对指定的下标数据前,插入数据
 * @param palist
 * @param position
 * @param x
 * @return
 */
int insertPre_seq(PSeqList palist, int position,int x){
    if(isNullList_Seq(palist))
        return -1;
    if(palist->MAXNUM <= position){
        printf("插入时,下标超过最大值\n");
        return -1;
    }
    if(position<0 || position>palist->n){
        printf("不存在下表为%d的元素\n",position);
    }
    for(int i = palist->n; i>=position; i--)
    {
        palist->vals[i] = palist->vals[i-1];
    }
    palist->vals[position] = x;
    palist->n += 1;
    printf("插入成功\n");
    return 1;
}

/**
 * 5.删除指定下标的元素
 * @param palist
 * @param position
 * @return
 */
int deleteP_seq(PSeqList palist,int position){
    if(isNullList_Seq(palist)){
        printf("线性表为空,无法删除\n");
        return -1;
    }
    if(position > palist->n || position < 0){
        printf("当前线性表不存在下表为%d的数据,无法删除\n",position);
        return -1;
    }
    for(int i = position + 1; i<palist->n;i++){
        palist->vals[i-1] = palist->vals[i];
    }
    palist->n -= 1;
    printf("删除成功\n");
    return 1;
}

/**
 * 6.查找元素的删除方法
 * @param palist
 * @param x
 * @return
 */
int deleteV_seq(PSeqList palist,int x){
    if(isNullList_Seq(palist)){
        printf("线性表为空,无法删除\n");
        return -1;
    }
    if(locate_seq(palist,x) == -1){
        printf("元素不存在,无法删除\n");
        return -1;
    }
    deleteP_seq(palist,locate_seq(palist,x));
    printf("删除成功\n");
    return 1;
}

/**
 * 7.初始化数据的方法
 * @param palist
 * @param data
 */
void initData(PSeqList palist,int data[]){
    for(int i=0;i<6;i++)
    {
        palist->vals[i] = data[i];
        (palist->n)++;
    }
}

/**
 * 8.线性表打印方法
 * @param palist
 */
void printSeqList(PSeqList palist){
    if(isNullList_Seq(palist)){
        printf("线性表为空,无法打印\n");
        return;
    }
    for(int i=0;i<palist->n;i++){
        printf("%d,",palist->vals[i]);
    }
    printf("\n");
}
/**
 * 程序测试入口
 * @return
 */
int main(){
    int data[] = {1,2,3,4,5,6};
    PSeqList palist = createNullList_Seq(100);
    printf("正在初始化数据...\n");
    initData(palist,data);
    printf("初始化成功,打印线性表\n");
    printSeqList(palist);
    printf("测试:判断线性表是否为空:%d\n",isNullList_Seq(palist));
    printf("寻找数据:4,返回下标%d\n",locate_seq(palist,4));
    printf("插入数据:666,在下标:2之前;是否成功:%d;打印线性表:\n",insertPre_seq(palist,2,666););
    printSeqList(palist);
    printf("测试:删除下标为3的数据,是否成功:%d\n",deleteP_seq(palist,3));
    printSeqList(palist);
    printf("测试:删除数据:5,是否成功:%d\n",deleteV_seq(palist,5));
    printSeqList(palist);
    printf("测试结束\n");
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值