线性表的初始化和插入操作

抽象数据的定义

//矩形ADT的定义 
//抽象类型的定义 
ADT Rectangle{
    length;//数据对象,非负实数,矩形的长 
    width://           非负实数,矩形的宽 
    
    init(&R,length,width);//将矩形的 R的长和宽分别初始化为lengthh和width 
    area(R);//返回矩形R的面积 
    circumference(R);//返回矩形R的周长 
}ADT Rectangle; //此处主义最后有一个分号 

//矩形ADT的表示
//定义矩形的存储结构
typedef struct
{
    float length;//矩形的长
    float width; //矩形的宽 
 } Rectangle;
bool init(Rectangle &R,float l,float w);
float  area(Rectangle &R,float l,float w);
float circumference(Rectangle R); 



//矩形ADT的实现
 bool init(Rectangle &R,float l,float w)
 {
     if(l>0&&w>0){
     R.length=1;
     R.width=w;
     return true;
    }
    else  
      return false;    
  } 
 float area(Restangle R)
 {
     return R.length*R.widdth;
  } 
  float circumference(Rectangle R )
  {
  return=2*(R.length+R.width); 
  

线性表的抽象数据和ADT描述

//伪代码,仅仅是描述 
ADT list{
    D={ai|ai|∈eleSet,i=1,2,...,n,n≥0}// 数据对象 
    R={<ai-1,ai>||ai-1,ai∈D,i=2,...,n,n≥0}//数据关系 
    void initList(*L);//初始化线性表,构造线性表,表长为0
    void insertList(*L,i,e);//在线性表的第i个元素之前插入一个元素 
    unsigned listLength(L);//求线性表的长度 
    eleType getElem(L,i);//获取线性表的第i个元素 
    void getElem2(L,i,*e);//获取线性表的第i个长度,放入 
    unsigned locateElem(L,e);//返回e在线性表中的位置 
    void listDelete(*L,i,*e);//删除线性表的第i个元素,将其值存放于变量e中 
    void printList(l,visit())//遍历线性表 
    int emptyList(L);//线性表判断空 
    void destroyList(*L); //销毁线性表 

}ADT list;

静态分配的代码如下

//初始化线性表,静态分配
void initList(SList *L)
{
    L->Selem=(eleType*)malloc(maxSize*sizeof(eleType));
    if(!L->Selem)//如果没有分配成功 
    {
        exit(OVERFLOW)//退出程序 ,提示溢出 
    }
    L->length=0;
    return 0; 
 } 
//静态分配,编译时以确定数组的大小和位置,程序运行期间不变
#define maxSize 1000//顺序表的最大长度 
typedef struct{//定义结构体类型 
    eleType Selem[maxSize];//线性表存储与数组Selem,一次性申请maxSize个数据元素所需的存储空间maxSize*sizeof(eleType个存储单元 
    
    unsigned length: //顺序表的当前长度,增删元素时需同步进行加减操作,length取值范围为0~maxSize-1 
    
    
}Slist;//静态分配空间的顺序表的类型名为Slist



//若length已等于maxSize,则不可以进行插入操作
//若length等于0,则不可以进行插入操作 

动态分配定义

//动态分配08/07/19 14:37
#define initSize 1000//顺序表的初始长度 
#define incSize 500//增大顺序表的存储空间时,每次的增长值 
typedef  struct {  //定义结构体类型
    eleType *Delem;//线性表存储与指向数组的指针Delem,当前数组并不存在,程序运行期间需要申请initSize*sizeof(eleTtype)个存储单元

    unsigned length; //顺序表的当前长度,增删元素时需同步进行加减操作,length取值为不超过当前申请存储单元个数的无符号数
} Dlist; //动态分配空间的顺序表的类型名为Dlist



//初始化时,为顺序表申请initSize个数据元素所需的连续存储空间,首地址存放于指针变量Delem
//若length已等于 maxSize,进行插入操作前需执行realloc函数,这样既保留元岑胡志,又能为数组 重新申请更大的连续存储空间,每次增长500个数据元素所占的存储空间量
//若length已等于0,则不可以进行删除操作
Name:
Copyright:
Author:
Date: 08/07/19 14:36
Description:
*/

静态插入处理,将e插入到线性表L的第i个元素之前 

void initList(SList*L,unsigned i,eleType e)
{
    if(L->Length==maxSize)//存储空间已满 
    exit(OVERFLOW);//退出程序,提示溢出 
    if(i<1||i<L->Length)//非法逻辑位置 
    exit(ERROR);//退出程序,提示位置出错 
    for(unsigned j=L->length-1;j>=i-1;j--) 
    L->Selem[j+1]=L->Selem[j];//从表尾开始到插入位置,数据元素一次后移一个位置
    
    L->Selem[i-1]=e;//e插入到第i个位置 
    L->length++;//表长加一 
    return 0; 
    
    
}
void initList(SList*L,unsigned i,eleTtype e)
{
    
    if(L->length==maxSize)
    exit(OVERFLOW);
    if(i<1||i>L->length)
    exit(ERROR);
    for(unsigned j=L->length-1;j>=i-1;j--)
    L->Selem[j+1]=L->Selem[j];
    
    L->Selem[i-1]=e;
    L->length++;
    return 0; 
 } 
void initList(Slist*L,unsigned i,eleTtype e)
{ 
    if(L->length==maxSize)
    exit(OVERFLOW);
    if(i>L->length||i<1)
    exit(Error)
    for(unsigned j=L->length-1;j>=i-1;j--)
    L->Selem[j+1]=L->Selem[j];
    
    L->Selem[i-1]=e;
    L->length++;
    return 0;
    
}

动态分配的插入处理

//动态分配代码如下
void insertList(DList *l,unsigned i,eleType e)
{
    if(L->length==intSize)
    {
        eleType *p;
        p=(eleType*)realloc(L->Delem,(initSize+incSize)sizeof(eleType));//这里的incSize是什么意思 
        //重新申请(iniSize+incSize)*sizeof(eleType)大小的存储空间,L->Delem中的L->length个数据元素赋值过来,新空间收地址为p 
        
        
        if(!p)
        exit(OVERFLOW);
        L->Delem=p;//L->Delem指向新申请到的存储空间 
        L->length+=incSize;//表长修改为新的的存储空间可存放的数据元素个数 
        
    }
    if(i>L->Length||i<1)
    exit(ERROR);
    for(unsigned j=L->length-1;j>=i-1;j--)//从表长开始到插入位置,数据元素依次后移一个位置 
    L->Delem[j+1]=L->Delem[j];
    
    L->Delem[i-1]=e;//一定要记住 ,e插入到线性表的的第i个位置 
    return 0;//为什么这里不需要线性表的长度加一 
    
}    
        
/*realloc函数用于修改一个原先已经分配的内存块的大小,
可以使一块内存的扩大或缩小。当起始空间的地址为空,即*ptr = NULL,
则同malloc。当*ptr非空:若nuw_size < size,即缩小*ptr所指向的内存空间,
该内存块尾部的部分内存被拿掉,剩余部分内存的原先内容依然保留;
若nuw_size > size,即扩大*ptr所指向的内存空间,
如果原先的内存尾部有足够的扩大空间,则直接在原先的内存块尾部新增内存,
如果原先的内存尾部空间不足,或原先的内存块无法改变大小,
realloc将重新分配另一块nuw_size大小的内存,并把原先那块内存的内容复制到新的内存块上。
因此,使用realloc后就应该改用realloc返回的新指针。*/

 

posted on 2019-07-09 21:13  lucky豆豆。  阅读(3939)  评论(0编辑  收藏  举报