线性表的实现

线性表的实现

最近一直在看数据结构方面的书,最先遇到的就是线性表,于是乎照猫画虎的写了一下线性表的代码.可能很多地方还有可以改进的地方,希望各位能在下面留言,非常期待各位高手宝贵的意见.

个人觉得比较难的几个地方是:
1.指针的使用.你会突然发现C学的简单的指针不够用了,需要学更多的关于指针的东西;
2.关于数组角标的计算.这种东西拿特殊情况带一下就能算出来啦.
下面还是PO出我的代码,供大家交流学习

/*
    Title: Array function practice(1)
    Date:2016-9-29
    Author: pengwill
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
// 定义一种结构叫做Arr
struct Arr{
    int *pBase;//线性表的首地址
    int cnt;//当前线性表的个数
    int len;//线性表最多能容纳的元素个数
};
int comp(void const *a, void const *b){
    return *(int*) a -  *(int*) b;
} 

void init_Arr(struct Arr * pArr, int length);//线性表的初始化
bool show_Arr(struct Arr * pArr); //打印线性表中的元素
bool is_empty(struct Arr * pArr); //判断线性表是否为空
bool scan_Arr(struct Arr * pArr, int n); //输入线性表的数据
bool del_elem(struct Arr * pArr,int n); // 删除线性表中某个元素 
bool append_elem(struct Arr * pArr, int n);//在线性表最后追加一个元素 
bool sort_Arr(struct Arr * pArr);//对线性表元素进行排序; 
bool insert_elem(struct Arr* pArr,int pos,int n);


int main()
{
    struct Arr arr;
    init_Arr(&arr,10);
    printf("%d %d\n",arr.len,arr.cnt);
    {
        scan_Arr(&arr,8);
        del_elem(&arr,8);
        show_Arr(&arr);
        append_elem(&arr,-100);
        show_Arr(&arr);
        sort_Arr(&arr);
        show_Arr(&arr);
        insert_elem(&arr,5,-10010);
        show_Arr(&arr);
        sort_Arr(&arr);
        show_Arr(&arr);

    }
    return 0;
}

void init_Arr(struct Arr * pArr, int length)
{

     pArr->pBase = (int*)malloc(sizeof(int) * length); //把操作系统请求分配的内部的首地址传给变量arr.pBase,完成初始化
     /*但是还有可能出现意外情况,即向操作系统请求分配内存失败,那么需要判断一下*/
    if(pArr->pBase == NULL){
        exit(-1);
    } else{
        pArr->cnt = 0;
        pArr->len = length;
        printf("---------Initializtion  Over---------\n");
    }
    /*如果请求分配内存失败,那么程序终止,否则完成的数组的cnt(当前个数)和len(数组总长度)的初始化*/
}


bool show_Arr(struct Arr * pArr)
{
    int i;
    if(is_empty(pArr) == true ){
        printf("---------The Array is empty!--------\n");
    }else {
        printf("------The Array is NOT empty!-------\n");
        printf("------Now output the elements!------\n");
        for(i = 0;i<pArr->cnt;i++){
            printf("%d\n",pArr->pBase[i]); // 这里卡住了,pBase没写出来 回头看一下;
                                            // 指针就是数组,数组就是指针,数组的单元就代表其地址
        }

    }

}

bool is_empty(struct Arr * pArr)
{
    if(0 == pArr->cnt){
        return true;
    }else{
        return false;
    }
}

bool scan_Arr(struct Arr * pArr, int n)
{
    int i;
    if(n > pArr->len){ // 判断防止数据数量超出分配的内存
        printf("-------------Error Number!-----------\n");
        return false;
    }else{
        for(i = 0;i<n;i++){
            scanf("%d",&pArr->pBase[i]);//挨个读入数据
        }
        pArr->cnt = n;// 更新当前数据的个数
        return true;
    }
}

bool del_elem(struct Arr * pArr,int n)//删除第n个元素 
{
    int i;
    if(n<= pArr->cnt){
        pArr->pBase[n-1] = 0;
        for(i = n-1;i<pArr->cnt;i++){
            pArr->pBase[i] = pArr->pBase[i+1];  
            show_Arr(pArr);
        } 
        (pArr->cnt)--;
        return true;
    }else{
        return false;
    }

} 

bool append_elem(struct Arr * pArr, int n)
{
    if(pArr->cnt == pArr->len){
        printf("Sorry! The array is full!\n");
        return false;
    } else{
        pArr->pBase[pArr->cnt] = n;
        pArr->cnt++;
        return true; 
    }

} 


bool sort_Arr(struct Arr * pArr)
{
    if(pArr->cnt != 0){
        qsort(pArr->pBase,pArr->cnt,sizeof(int),comp);
        return true;
    }else{
        return false;
    }

}

bool insert_elem(struct Arr* pArr,int pos,int n)
{
    int i;
    if(pos<=pArr->cnt && pArr->cnt <= pArr->len-1){

        for(i = pArr->cnt-1;i>=pos -1 ;i--){
            pArr->pBase[i+1] = pArr->pBase[i];
        }
        pArr->pBase[pos-1] = n;
        pArr->cnt++;
        return true;
    } else{
        return false;
    }

}
posted @ 2016-09-29 17:05  pengwill  阅读(140)  评论(0编辑  收藏  举报