C语言实现线性表之顺序表

来源:互联网 发布:知乎日报吐槽合集 编辑:程序博客网 时间:2024/06/04 08:26

线性表的抽象数据类型

ADT 线性表(LIST)DATA线性表的数据集合为{a1,...an},每个元素类型均为DataType,其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素外,每个元素都有一个直接后继元素。数据元素之间的关系是一对一的关系。OPERATION    InitList(*L);/*初始化操作,建立一个空的线性表L*/    ListEmpty(L);/*若线性表为空,返回true*/    ClearList(*L);/*将线性表清空*/    GetElem(L,i,e);/*将线性表L中第i的位置返回给e*/    LocateElem(L,e);/*在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素表中的序号,否则,返回0失败*/    ListInsert(*L,i,e);/*在线性表L中的第i个位置插入新元素e*/    ListDelete(*L,i,*e);/*删除线性表L中第i个元素,并用e返回其值*/    ListLength(L);/*返回线性表L的元素个数*/ENDADT

线性表的顺序存储结构

定义

  • 线性表的顺序结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素

特点

  • 结点中只有自身的信息域,没有关联信息域。因此,顺序存储结构的存储密度大、存储空间利用率高。
  • 通过计算地址直接访问任何数据元素,即可以随机访问。
    • 插入和删除操作会引起大量元素的移动

顺序表的头文件定义

#ifndef Seq_LIST_H#define Seq_List_Hextern Status;# define MAXSIZE 20 /*STORAGE INITIAL SIZE*/    typedef int ElemType;/*Depend on your solution*/    typedef struct SQ    {        ElemType data[MAXSIZE];/*data array,maxsize is MAXSIZE.*/        int length;/*SeqList current length.*/    }SqList;    /*declaration*/    void InitList(SqList *);    bool ListEmpty(SqList);/*assert the structure is empty*/    bool ClearList(SqList *);/*clear the List*/    Status GetElem(SqList,int,ElemType *);    int LocateElem(SqList,int);    bool ListInsert(SqList *,int,ElemType);    Status ListDelete(SqList *,int,ElemType *);    int ListLength(SqList);#endif

顺序表的函数实现

#include <stdio.h>#include <stdlib.h>#include "SeqList.h"#define ERROR 0#define OK 1typedef int Status;/*implement the declaration*/void InitList (SqList *sqlist){    sqlist->data[0]=NULL;    sqlist->length=0;}bool ListEmpty(SqList sqlist){    return sqlist.length==0?true:false;}Status ClearList(SqList &sqlist){    return  ((&sqlist)->length=0)&&((&sqlist)->data[0]=NULL) ? OK:ERROR;}/*take the index i value into e in sqlist*/Status GetElem(SqList sqlist,int i,ElemType *e){    if(sqlist.length==0||i<1||i>sqlist.length)        return ERROR;    *e=sqlist.data[i-1];    return OK;}int LocateElem(SqList sqlist,int e){    int index;    if(sqlist.data[0]==NULL||sqlist.length==0)    {        return 0;    }    else    {        for(index=0;index<sqlist.length-1;index++)        {            if(sqlist.data[index]==e)            {                break;            }            else            {                return 0;            }        }        return index+1;    }}bool ListInsert(SqList *sqlist,int i,ElemType e){    int k;    if(sqlist->length==MAXSIZE)    {        return false;    }    if(i<1||i>sqlist->length+1)    {        return false;    }    if(i<=sqlist->length)    {        for(k=sqlist->length-1;k>i-1;k++)        {            sqlist->data[k+1]=sqlist->data[k];        }    }    sqlist->data[i-1]=e;    sqlist->length++;    return true;}Status ListDelete(SqList *sqlist,int i,ElemType *e){    int k;    if(sqlist->length==0)        return ERROR;    if(i<1||i>sqlist->length+1)        return ERROR;    *e=sqlist->data[i-1];    if(i<sqlist->length)    {        for(k=i;k<sqlist->length;k++)        {            sqlist->data[k-1]=sqlist->data[k];        }    }    sqlist->length--;    return OK;}int ListLength(SqList sqlist){    return sqlist.length;}

代码是基于c语言对数据结构进行阐述。代码逻辑不难,有什么看不透的欢迎留言,指正,交流。

原创粉丝点击