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


抽象數據的定義

//矩形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返回的新指針。*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM