線性表 初始化 插入 刪除 的操作
阿新 • • 發佈:2019-01-05
#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