zoukankan      html  css  js  c++  java
  • 线性表--顺序线性表-基本操作:建表,插入,删除

    代码里面的一些 define先了解一下:

    #define LIST_INIT_SIZE 100   //线性表的初始建立长度
    #define LISTINCREMENT 10     //每次增加的长度
    #define ElemType int //线性表的存储的基本数据型 #define OK 1 #define OVERFLOW -2 #define ERROR -1 #define Status int

     我用的书是严蔚敏的《数据结构(C语言版)》 紫色书。

    书上的代码都很好理解,学习时候碰到过的小问题会总结提醒一下。

    1. 函数会出现 类似于 void MergeList(List La,List Lb, List &Lc) 这样的函数定义,一开始我也是直接照着抄上了,记着在用C++时用过,结果一直报错,

    百度一下发现,C语言是没有&Lc这种形式的形参的,在C++中叫做引用。

    2. 所以传入函数的应该是线性表的地址,函数里面对线性表的操作都要用指针实现  例如:L.length  要改成 L->length

    1 Status InitList_Sq(Sqlist *L)
    2 {   //构造一个空的线性表
    3     L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    4     if(!L->elem) exit(OVERFLOW);  //储存分配失败
    5     L->length = 0;                //空表长度为0
    6     L->listsize = LIST_INIT_SIZE; //初始存储容量
    7     return OK;
    8 }//InitList_Sq
     1 Status ListInsert_Sq(Sqlist *L, int i, ElemType e)
     2 {
     3     //在顺序线性表L中第i个位置之前插入新的元素e
     4     //i的合法值为1<=i<=ListLength_Sq(L) + 1
     5     ElemType *newbase, *q, *p;
     6 
     7     if(i < 1 || i > L->length + 1) return ERROR;//i值不合法
     8     if(L->length >= L->listsize)                //当前存储空间已满,增加分配
     9     {
    10         newbase = (ElemType *)realloc(L->elem,
    11                     (L->listsize + LISTINCREMENT)*sizeof(ElemType));
    12         if(!newbase) return ERROR;     //分配失败
    13         L->elem = newbase;             //新基址
    14         L->listsize += LISTINCREMENT;  //增加存储容量
    15     }
    16     q = &L->elem[i-1];                 //q为插入位置
    17     for(p = &L->elem[L->length-1]; p >= q; --p)
    18         *(p+1) = *p;                   //插入位置及之后的元素后移
    19     *q = e;         //插入e
    20     L->length++;    //表增长1
    21     return OK;
    22 }//ListInsert_Sq
     1 Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e)
     2 {
     3     //在顺序线性表L中删除第i个元素,并用e返回其值
     4     //i的合法值为1<=i<=ListLength_Sq(L)
     5     ElemType *p, *q;
     6     if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法
     7 
     8     p = &L->elem[i-1];                //p为被删除元素的位置
     9     *e = *p;                         //被删除元素的值赋给e
    10     q = &L->elem[i] + L->length - 1;//表尾元素的位置
    11     for(++p; p <= q; p++)           //++p为要移动元素的第一个
    12         *(p-1) = *p;                //元素左移
    13     L->length--;                    //表长减一
    14     return OK;
    15 }//ListDelete_Sq

    下面的完整代码,可以试一试:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    #define ElemType int
    
    #define OK 1
    #define OVERFLOW -2
    #define ERROR -1
    #define Status int
    
    typedef struct{
        ElemType *elem;//存储空间基址
        int length;     //当前长度
        int listsize;   //当前分配的存储容量
    }Sqlist;
    
    Status InitList_Sq(Sqlist *L)
    {   //构造一个空的线性表
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
        if(!L->elem) exit(OVERFLOW);  //储存分配失败
        L->length = 0;                //空表长度为0
        L->listsize = LIST_INIT_SIZE; //初始存储容量
        return OK;
    }//InitList_Sq
    
    Status ListInsert_Sq(Sqlist *L, int i, ElemType e)
    {
        //在顺序线性表L中第i个位置之前插入新的元素e
        //i的合法值为1<=i<=ListLength_Sq(L) + 1
        ElemType *newbase, *q, *p;
    
        if(i < 1 || i > L->length + 1) return ERROR;//i值不合法
        if(L->length >= L->listsize)                //当前存储空间已满,增加分配
        {
            newbase = (ElemType *)realloc(L->elem,
                        (L->listsize + LISTINCREMENT)*sizeof(ElemType));
            if(!newbase) return ERROR;     //分配失败
            L->elem = newbase;             //新基址
            L->listsize += LISTINCREMENT;  //增加存储容量
        }
        q = &L->elem[i-1];                 //q为插入位置
        for(p = &L->elem[L->length-1]; p >= q; --p)
            *(p+1) = *p;                   //插入位置及之后的元素后移
        *q = e;         //插入e
        L->length++;    //表增长1
        return OK;
    }//ListInsert_Sq
    
    Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e)
    {
        //在顺序线性表L中删除第i个元素,并用e返回其值
        //i的合法值为1<=i<=ListLength_Sq(L)
        ElemType *p, *q;
        if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法
    
        p = &L->elem[i-1];                //p为被删除元素的位置
        *e = *p;                         //被删除元素的值赋给e
        q = &L->elem[i] + L->length - 1;//表尾元素的位置
        for(++p; p <= q; p++)           //++p为要移动元素的第一个
            *(p-1) = *p;                //元素左移
        L->length--;                    //表长减一
        return OK;
    }//ListDelete_Sq
    
    
    int main()
    {
        Sqlist L;
        if(!InitList_Sq(&L))
            exit(OVERFLOW);
        int a[ ] = {12, 13, 21, 24, 28, 30, 42, 77};//线性表的元素
        for(int i=0; i<8; i++)  //建表
        {
            L.elem[i] = a[i];
            L.length++;        //记录长度
        }
        printf("~~~~~~
    ");
        for(int i=0; i < L.length; i++)
            printf("%d ",L.elem[i]);
        printf("
    length = %d
    ",L.length);
    
        printf("
    ~~~~~~
    ");
        ListInsert_Sq(&L, 5, 25);   //在第五个位置插入值 25
        for(int i=0; i < L.length; i++)
            printf("%d ",L.elem[i]);
        printf("
    length = %d
    ",L.length);
    
        printf("
    ~~~~~~
    ");
        int e;
        ListDelete_Sq(&L, 5, &e);  //在第五个位置删除值  25
        for(int i=0; i < L.length; i++)
            printf("%d ",L.elem[i]);
        printf("
    length = %d
    ",L.length);
        printf("e = %d
    ",e);
    
        printf("
    ~~~~~~~
    ");
        return 0;
    
    }
    View Code
  • 相关阅读:
    SQLite 版本引发的 Python 程序调用问题
    从0到10亿,微信后台架构及基础设施设计与实践!
    从Oracle到PostgreSQL:动态性能视图 vs 标准统计视图
    第一章 准备工作
    Swagger2简介
    如何查询numpy,scipy,matplotlib等的版本和安装位置
    完美解决ImportError: cannot import name '_validate_lengths'报错问题
    完美解决AttributeError: module 'scipy.misc' has no attribute 'imread'报错问题
    线上课堂:ernetes Operator开发范式
    Bomb Enemy 炸弹人
  • 原文地址:https://www.cnblogs.com/Dawn-bin/p/9500694.html
Copyright © 2011-2022 走看看