C语言实现顺序表


数据结构是个很难学的东西。首先概念上十分抽象,不容易理区分和理解;其次初学者实现起来很困难,书上一般给的程序不是伪代码,就是不完整的代码,想要上机做实验有很大问题。所以学习过程中稍微遇上点麻烦就很容易放弃。鉴于自己在学习数据结构的痛苦经历特地分享一下自己的完整代码,希望能对新手提供一些微小的帮助。


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

typedef enum {true, false} bool;
typedef struct Arr{
    int *pBase;
    int len;
    int cnt;
}Array, *pArray;

//函数声明
void init_arr(pArray parr, int len);//生成一个顺序表
bool is_empty(pArray parr);//判断顺序表是否为空
bool is_full(pArray parr);//判断顺序表是否为满
bool append_arr(pArray parr, int val);//追加一个元素
void show_arr(pArray parr);//打印顺序表

bool insert_arr(pArray parr, int pos, int val);//在第pos的位置插入val
bool delete_arr(pArray parr, int pos, int *pVal);//删除第pos个元素
int get(pArray parr, int pos);//得到第pos个元素值
void inversion(pArray parr);//倒转顺序表
void sort_arr(pArray parr);//顺序表的排序


int main(int argc, const char * argv[]) {
    
    Array arr;
    int val, getval;
    
    init_arr(&arr, 6);
    append_arr(&arr, 13);
    append_arr(&arr, 4);
    append_arr(&arr, 34);
    append_arr(&arr, 6);
    show_arr(&arr);
    insert_arr(&arr, 2, 99);
    show_arr(&arr);
    if (delete_arr(&arr, 2, &val)==true) {
        printf("删除成功,删除的数据为:%d\n", val);
    }else{
        printf("删除失败");
    }
    show_arr(&arr);
    getval = get(&arr, 4);
    printf("得到的值为:%d\n", getval);
    inversion(&arr);
    show_arr(&arr);
    sort_arr(&arr);
    show_arr(&arr);
    
    return 0;
}

void init_arr(pArray parr, int len){
    parr->pBase = (int *)malloc(sizeof(int)*len);
    if (parr->pBase == NULL) {
        printf("内存分配失败\n");
        exit(-1);
    }else{
        parr->len = len;
        parr->cnt = 0;
    }
    
    return;
}

bool is_empty(pArray parr){
    if (parr->cnt == 0) {
        return true;
    }else
        return false;
}

bool is_full(pArray parr){
    if (parr->cnt == parr->len) {
        return true;
    }else
        return false;
}

bool append_arr(pArray parr, int val){
    if (is_full(parr) == true) {
        return false;
    }else{
        parr->pBase[parr->cnt] = val;
        parr->cnt++;
    }
    
    return true;
}

void show_arr(pArray parr){
    if (is_empty(parr) == true) {
        printf("顺序表为空!\n");
        exit(-1);
    }else{
        for (int i=0; i<parr->cnt; i++) {
            printf("%d ", parr->pBase[i]);
        }
    }
    printf("\n");
    
    return;
}

bool insert_arr(pArray parr, int pos, int val){
    if (is_full(parr) == true) {
        return false;
    }
    if (pos<1 || pos>parr->cnt+1) {
        return false;
    }
    for (int i = parr->cnt-1; i>=pos-1; i--) {
        parr->pBase[i+1] = parr->pBase[i];
    }
    parr->pBase[pos-1] = val;
    (parr->cnt)++;
    
    return true;
}

bool delete_arr(pArray parr, int pos, int *pVal){
    if (is_empty(parr) == true) {
        return false;
    }
    if (pos<1 || pos>parr->cnt) {
        return false;
    }
    *pVal = parr->pBase[pos-1];
    for (int i=pos; i<parr->cnt; i++) {
        parr->pBase[i-1]=parr->pBase[i];
    }
    (parr->cnt)--;
    
    return true;
}

int get(pArray parr, int pos){
    if (is_empty(parr) == true) {
        return false;
    }
    if (pos<1 || pos>parr->cnt) {
        return false;
    }
    
    return parr->pBase[pos-1];
}

void inversion(pArray parr){
    if (is_empty(parr) == true) {
        printf("顺序表为空!\n");
        exit(-1);
    }else{
        int i = 0;
        int j = parr->cnt-1;
        int t;
        while (i<j) {
            t = parr->pBase[i];
            parr->pBase[i] = parr->pBase[j];
            parr->pBase[j] = t;
            i++;
            j--;
        }
    }
    
    return;
}

void sort_arr(pArray parr){
    int i, j, t;
    
    for (i=0; i<parr->cnt; i++) {
        for (j=i+1; j<parr->cnt; j++) {
            if (parr->pBase[i] > parr->pBase[j]) {
                t = parr->pBase[i];
                parr->pBase[i] = parr->pBase[j];
                parr->pBase[j] = t;
            }
        }
    }
    
    return;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值