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

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. 存储空间容易造成大量的碎片。

posted on 2013-02-19 23:40  GreenLight  阅读(255)  评论(0)    收藏  举报