线性表之顺序表

最近在准备考研,博客的更新没有没有保障。学习了一点数据结构,但书中多为伪码体现,看了几遍后仍体会不到其精要,私以为实践才是最好的老师,so打算开坑,用C++实现各个专题内容。比较初级,关于其中的一些优化和错误,请dalao积极指正。感谢。
  除去一些算法基础知识及C/C++入门知识,首先便是线性表。线性表一般分顺序表和链表。今天主要先来实现下顺序表的初始化、创建、查找、插入、删除。
下列程序笔者在code block运行成功


运行示例
    #include <cstdio>
    #include <cstdlib>
    #define  ElementType int
    #define MAXSIZE 1000
    #define ERROR -1
    
    
    /*线性表-顺序表-结构体定义*/
    typedef struct LNode *List;
    struct LNode {
        ElementType Data[MAXSIZE];
        int Last;                                       /*最后一个位置下标,用来计算顺序表的长度*/
    };/*L1,*Ptrl1; 结构体定义方法*/
    struct LNode L;
    List PtrL = &L;
    
    /*两种数据访问方式 L.Data[i] || PtrL -> Data[i]*/
    /*访问顺序表长度 L。Last + 1 || PtrL -> Last + 1*/
    
    /* 初始化 */
    List MakeEmpty(){
        List PtrL;                                      /*①先定义一个节点的指针PrrL*/
        PtrL = (List)malloc(sizeof(struct LNode));      /*②用函数malloc()来申请一个节点的空间,大小为sizeof(struct LNode)*/
        PtrL -> Last = -1;                              /*再强制转换List型,即struct LNode*型的指针*/
        return PtrL;
    }
    /* 初始化方式2-使其返回L而非L的地址 */
    struct LNode MakeEmpty2(){
        struct LNode L;
        *PtrL = L;                                        /*malloc返回的必须是指针,&L不能放在等号左边*/
        PtrL = (List)malloc(sizeof(struct LNode));        /*故给L定义一个指针向量Ptrl指向L*/
        L.Last = -1;
        return L;
    }
    
    /* 查找 */
    /* 查找X,并返回其存储位置 */
    int Find( List Ptrl, ElementType X )
    {
        int i = 0;
    
        while( i <= PtrL->Last && PtrL->Data[i]!= X )
            i++;
        if ( i > Ptrl->Last )  return ERROR;    /* 如果没找到,返回错误信息 */
        else  return i;                         /* 找到后返回的是存储位置 */
    }
    
    /* 插入 */
    /* 在L的指定位置P前插入一个新元素X,注意P是数组下标,从0开始 */
    bool Insert( List &PtrL, ElementType X, int P ){
        int i;
        if ( PtrL->Last == MAXSIZE - 1) {
            /* 表空间已满,不能插入 */
            printf("表满");
            return false;
        }
        if ( P < 0 || P > PtrL->Last + 1) { /* 检查插入位置的合法性 */
            printf("位置不合法");
            return false;
        }
        for( i = PtrL->Last; i >= P; i--)
            PtrL->Data[i+1] = PtrL->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
        PtrL->Data[P] = X;  /* 新元素插入 */
        PtrL->Last++;       /* Last仍指向最后元素,长度+1 */
        return true;
    }
    
    /* 删除 */
    /* 从L中删除指定位置P的元素,注意P是数组下标,从0开始 */
    bool Delete( List &PtrL, int P ){
        int i;
        if( P < 0 || P > PtrL->Last ) { /* 检查空表及删除位置的合法性 */
            printf("位置%d不存在元素", P );
            return false;
        }
        for( i = P + 1; i <= PtrL->Last; i++ )
            PtrL->Data[i-1] = PtrL->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */
        PtrL->Last--; /* Last仍指向最后元素,长度-1 */
        return true;
    }
    
    int CreatNewList(List &PtrL, int n){/*此处PtrL用引用,否则无法真正输入新表值*/
        PtrL = (List)malloc(sizeof(struct LNode));
        printf("输入新顺序表表值:");
        for( int i = 0; i < n; i++){
            scanf("%d",&PtrL->Data[i]);
            PtrL->Last++;
        }
        printf("新顺序表表值为:");
        for( int i = 0; i < n; i++){
            printf("%d",PtrL->Data[i]);
        }
        printf("\n");
        return 1;
    }
    
    
    int main()
    {
        int n;
        int X,Y,Z;
        int P;
        int findP;
        MakeEmpty();
        printf("输入所要创建顺序表的位数:");
        scanf("%d",&n);
        CreatNewList(PtrL , n);
    
        printf("查找功能:输入所要查找的顺序表值:");
        scanf("%d",&X);
        findP = Find( PtrL, X );
        printf("查找功能:查找到的值的下标位于第%d位\n",findP);
    
        printf("插入功能:输入所要插入的值及下标位置:");
        scanf("%d %d",&Y,&P);
        Insert(PtrL, Y, P);
        printf("插入功能:新顺序表表值:");
        for( int i = 0; i < n + 1; i++){
            printf("%d",PtrL->Data[i]);
        }
        printf("\n");
    
        printf("删除功能:输入所要删除的下标位置:");
        scanf("%d",&Z);
        Delete( PtrL, Z );
        printf("删除功能:新顺序表表值:");
        for( int i = 0; i < n ; i++){
            printf("%d",PtrL->Data[i]);
        }
        return 0;
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容