抽象數據的定義
//矩形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返回的新指針。*/