数据结构---顺序表

本文介绍了顺序表的基本概念及其实现方式,包括利用连续内存单元存储线性表的特性。详细阐述了初始化、删除、插入及删除元素等操作,并通过C语言代码示例展示这些操作的具体实现过程。此外还讨论了顺序表的优点与缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用一组连续地址的内存单元来存储整张线性表的结构。 具有下列特征:

1. 顺序表的表名唯一。

2. 内存单元连续存储。

3. 数据顺序存放,元素之间有先后关系。

下面的例子中,我们动态的申请一张线性表。

主要定义的方法有

InitSqlist : 初始化list。

DeleteSqlist: 删除list。

InsertElem:  添加元素。当插入元素,表的元素容量大于MAXSIZE的时候,重新分配表的大小,并且copy原来的元素。采用C语言的函数realloc来实现。

DeleteElem:删除元素。

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10000
#define ADDSIZE 100
typedef int ElemType;


// the definition of sequence table
struct Sqlist
{
    ElemType *m_pElem;  // the first element address
    int m_iLength;      // the number of the elements
    int m_iListSize;    // the max number of the elements
};

// initilize the sqlist
void InitSqlist(Sqlist *L)
{
    L->m_pElem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
    L->m_iLength = 0;
    L->m_iListSize = MAXSIZE;
}

// Delete the sqlist
void DeleteSqlist(Sqlist *L)
{
    free (L->m_pElem);
    L->m_pElem = nullptr;
    L->m_iLength =0;
    L->m_iListSize =0;
}

// insert the element to ith position
void InsertElem(Sqlist *L, int i, ElemType item)
{
    if(i < 1 || i > L->m_iLength + 1)exit(0);
    // add the memory for list
    ElemType *base, *insertPtr, *p;
    if(L->m_iLength == L->m_iListSize)
    {
        base = (ElemType*) realloc(L->m_pElem, (L->m_iListSize + ADDSIZE)*sizeof(ElemType));
        L->m_iListSize+= ADDSIZE;
        L->m_pElem = base;
    }
    insertPtr = &(L->m_pElem[i-1]);
    for(p = &(L->m_pElem[L->m_iLength-1]); p>= insertPtr;p--)
    {
        *(p+1) = *p;
    }
    *insertPtr = item;
    L->m_iLength++;
}

// delete the element for ith position
void DeleteElem(Sqlist *L, int i)
{
    if(i<1 || i> L->m_iLength)exit(0);
    ElemType *pDelete, *q;
    pDelete = &(L->m_pElem[i-1]);
    q = &(L->m_pElem[L->m_iLength-1]);
    for(++pDelete; pDelete <=q ;pDelete++)
    {
        *(pDelete-1) = *pDelete;
    }
    L->m_iLength--;
}


// print the list elements
void PrintElement(Sqlist *L)
{

    int iLength = L->m_iLength;
    if(iLength ==0)exit(0);
    printf("list Max size =%d \n", L->m_iListSize);
    printf("list current length = %d \n",L->m_iLength);
    for(int i= 0;i<iLength;i++ )printf("  %d  ", L->m_pElem[i]);
}

void main()
{
    Sqlist list;
    InitSqlist(&list);
    InsertElem(&list, 1, 1);
    InsertElem(&list, 2, 2);
    InsertElem(&list, 3, 3);

    PrintElement(&list);
    DeleteElem(&list, 1);
    DeleteElem(&list, 1);
    
    PrintElement(&list);
    DeleteSqlist(&list);
}

优点:1. 无须增加额外的内存空间来描述元素之间的逻辑。2.可以快速的读取表中的任一位置。

缺点:1. 插入和删除操作需要移动大量的元素。2. 当线性表的长度添加时,需要申请额外的空间,然后进行copy操作。3. 存储空间容易造成大量的碎片。

转载于:https://www.cnblogs.com/bruce81/archive/2013/02/19/2917905.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值