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

什么是线性表?

  线性表是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).此外,顺序表还要求系统分配连续的存储空间,这就给存储空间的分配提出了更高的要求,而且也容易造成存储空间的利用率不高等问题。正是由于顺序表种种的不方便,所以才引入了链表,链表的出现解决了很多顺序表解决不了的问题,最明显的变化就是元素存储空间不需要连续。当然,这需要借助指针来实现,这就引入了新的问题。总体而言,顺序表和链表各有优缺点,在选择时,要根据实际情况选择更加适合的数据结构。

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

时间: 2024-10-14 02:27:31

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

简单顺序表的插入,删除,指定位置,指定元素的插入删除操作

头文件 SeqList.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<stdio.h> #include<string.h> #include<assert.h> #define MAX_SIZE 10 typedef int DataType; typedef unsigned int size_t; typedef struct SeqList { DataType array[MAX_SIZE]; s

顺序表的插入和删除、数组的增删改查和二分查找

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "PingFang SC" } span.s1 { font: 24.0px Helvetica } 1.顺序表的表示 为实现顺序表的操作,首先要将其表示出来,用同数据类型的数组和表示数组的长度的整型变量表示. public class LineList{ private int[] data; private int length; public LineList(){ } pu

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。

#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef int ElemType; typedef int Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 ElemType * new

C语言实现顺序表(数据结构线性表部分)

-------------------------------------------- 顺序表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 概念图 模块设计:伪代码写的非常差劲- -见谅 //初始化顺序表(InitList) 使用malloc函数

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R

【数据结构】用C语言实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等) //头文件 #ifndef _SEQLIST_H #define _SEQLIST_H #include<stdio.h> typedef int ElemType; #define INIT_SIZE 8 typedef struct SeqList { ElemType *base; size_t capacity; size_t size; }SeqList; int isempty(SeqList *list); in

顺序表插入、删除算法用C语言来实现

#include<stdio.h> #include<stdlib.h> //-------- 线性表的动态分配顺序存储结构 ----------- int LIST_INIT_SIZE=100;   //顺序表存储空间初始尺寸 int LISTINCREMENT=10;  //顺序表存储空间分配增量 typedef  int  ElemType;          //顺序表元素的数据类型为整数 //存储结构定义:顺序表 typedef struct { ElemType *el