码迷,mamicode.com
首页 > 编程语言 > 详细

用C语言实现顺序表的插入和删除算法

时间:2018-11-05 20:55:16      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:bsp   顺序   ora   解决   方式   很多   元素   结构体   incr   

什么是线性表

  线性表是n个数据元素的有限序列。根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的)。

线性表如何用C语言实现?线性表可以进行哪些操作

  在C语言中,线性表通过结构体的方式来实现。结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量。操作包含在指定位置插入某一元素、删除指定元素、查找指定的元素等。在这里重点介绍插入和删除算法。  

  下面就是关于这一部分内容的陈述。

线性表的C语言实现

  • 需要先定义好的内容
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OK 1
#define ERROR  0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;

 

  • 定义线性表
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
  • 写一个函数,构造一个空的线性表L
Status InitList_Sq(SqList &L){
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//malloc函数为分配一个内存空间
    if(!L.elem) exit(OVERFLOW);//存储分配失败
    L.length=0;//空表的长度为零
    L.listsize=LIST_INIT_SIZE;//设置初始分配容量
    return OK;      
}
  • 顺序表的插入操作
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

    从顺序表的插入和删除算法可以看出,顺序表的插入和删除操作是通过数据元素的移动来实现的,因此,线性表的插入和删除的算法时间复杂度都是O(n).此外,顺序表还要求系统分配连续的存储空间,这就给存储空间的分配提出了更高的要求,而且也容易造成存储空间的利用率不高等问题。正是由于顺序表种种的不方便,所以才引入了链表,链表的出现解决了很多顺序表解决不了的问题,最明显的变化就是元素存储空间不需要连续。当然,这需要借助指针来实现,这就引入了新的问题。总体而言,顺序表和链表各有优缺点,在选择时,要根据实际情况选择更加适合的数据结构。

 

用C语言实现顺序表的插入和删除算法

标签:bsp   顺序   ora   解决   方式   很多   元素   结构体   incr   

原文地址:https://www.cnblogs.com/freeurmind/p/9911233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!