zoukankan      html  css  js  c++  java
  • 线性表的实现

    线性表的实现

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

    个人觉得比较难的几个地方是:
    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
    ",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---------
    ");
        }
        /*如果请求分配内存失败,那么程序终止,否则完成的数组的cnt(当前个数)和len(数组总长度)的初始化*/
    }
    
    
    bool show_Arr(struct Arr * pArr)
    {
        int i;
        if(is_empty(pArr) == true ){
            printf("---------The Array is empty!--------
    ");
        }else {
            printf("------The Array is NOT empty!-------
    ");
            printf("------Now output the elements!------
    ");
            for(i = 0;i<pArr->cnt;i++){
                printf("%d
    ",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!-----------
    ");
            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!
    ");
            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;
        }
    
    }
  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367272.html
Copyright © 2011-2022 走看看