#include <stdio.h> #include <stdlib.h> #define LEN sizeof(ElemType) #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 typedef int ElemType typedef int Status const LIST_INIT_SIZE=100;//表初始分配空間 const LIST_INCREMENT=10;//空間分配增量 typedef struct { //封裝一個線性表 為SqList ElemType *elem;//存儲空間,存放頭地址,也可表示數組的名字 或地址 或第一個元素 int length;//線性表當前長度 int listSize;//當前存儲容量 int LIST_INCREMENT;//可增加存儲容量 } SqList; Int ListEmpty(SqList L){ //判斷線性表L是否為空 if L.length=0 return TURE; else return FALSE; } int ListLength_Sq(SqList L){ //求線性表的長度 return L.length; } Status InitList_Sq(SqList &L){ //初始化空的線性表,&L 引用參數表示會修改值 //構造空表 L.elem =(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配內存,返回void*指針,類型強轉一下 if(!L.elem) exit(OVERFLOW);//OVERFLOW是返回到OS的 L.length=0; L.listSize=LIST_INIT_SIZE; return TRUE; }//InitList_Sq Status ListInser_Sq(SqList &L,int i,ElemType e){ //插入線性表,i是下標+1表示序號,E是插入值 if( i<1 || i>L.length) return FALSE;//i的合法值為1<=i<=ListLength_Sq(L) if(L.length>=L.listSize){ //當前存儲空間已滿,(realloc就是)增加內存分配,函數realloc() // void* realloc(void* ptr, unsigned newsize); 給一個已經分配了地址的指針重新分配空間,參數ptr為原有的空間地址,newsize是重新申請的地址長度. newbase =(ElemType *)realloc(L.elem,L.(LIST_INIT_SIZE+LIST_INCREMENT)*sizeof(ElemType)); if(!newbase) exit(OVERFLOW);//存儲分配失敗 L.elem = newbase;//新的地址 L.listSize += LIST_INCREMENT;//增加存儲容量 } q = &(L.elem[i-1]);//q為插入位置 for(p=&(L.elem[L.length-1]); p>=q; --p) { //插入位置及其之后的元素右移 *(p+1) = *p; } *q = e;//插入e 的值 ++L.length;//表長度+1 return TRUE; }//ListInser_Sq Status ListInser_Sq_Se(SqList &L,int i,ElemType e){ //插入線性表 簡化寫法 使用指針 不要新開辟內存 if( i<1 || i>L.length ) return FALSE;//i的合法值為1<=i<=ListLength_Sq(L) if(L.length>=L.listSize) exit(OVERFLOW);//超出存儲空間,報錯退出 q = &(L.elem[i-1]);//q為插入位置 for(p=&(L.elem[L.length-1]); p>=q; --p) { //插入位置及其之后的元素右移,p=&(L.elem[L.length-1]表示最末尾的指針, *(p+1) = *p; } *q = e;//插入e 的值 ++L.length;//表長度+1 return TRUE; } Status ListDelete_Sq(SqList &L,int I,ElemType &e){ //刪除線性表中的第i個元素 //刪除L中第i個元素,后面的元素前移 if((i<1)||(i>L.length)) return FALSE; p=&L.elem[i-1];//p表示刪除的地址 e=*p;//返回e的值 q=L.elem+L.length-1;//q存放的是線性表內最后位置的指針 for(++p;p<=q;++p) { //后面的元素前移,先++p是因為p的位置是刪除的位置,所以從刪除位置的右邊+1算起 *(p-1)=p;//刪除的位置 后面的元素前移 } --L.length; return TRUE; } Int CompareArray(SqList A,SqList B){ //比較數組大小的方法 j=0;//計數器 while(j<A.length && j<B.length) { if(A.elem[j]<B.elem[j]) return -1; else if(A.elem[j]>B.elem[j]) return 1; else j++; } if(A.length==B.length) return 0; else if(A.length<B.length) return -1; else return 1; }//CompareArray