資料結構-順序表
阿新 • • 發佈:2018-12-13
線性結構的特點是:在資料元素的非空有限集中,存在一個唯一的被稱作為第一個的資料元素,存在唯一的一個被稱作最後一個的資料元素,除第一個外,集合中的每個資料元素均只有一個前驅,出最後一個外,集合中每個資料元素均只有一個後繼。
關係採用順序映像,形成順序儲存結構,稱之為順序表。
編譯環境:CodeBlocks 使用語言:類C語言
初始定義的輔助定義:
#define OK 1 #define LIST_INIT_SIZE 100//初始容量 #define LISTINCREMENT 10 //空間增量 #define ERROR 0 #define FALSE 0 #define TRUE 1 #define NULL 0 #define OVERFLOW -1 typedef int status;
順序表的儲存結構定義:
typedef int ElemType; //假設線性表元素為整形
typedef struct SqList{
ElemType *elem; //儲存元素首地址
int ListSize; //表容量大小
int length; //表中元素個數
}SqList;
初始化一個空的有序順序表:
status InitList_Sq(SqList &L){ //初始化一個空的有序順序表 L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(L.elem==NULL) exit(OVERFLOW); L.ListSize=LIST_INIT_SIZE; L.length=0; return OK; }
刪除第i個元素並用e帶回 i介於1與L.length之間.
status ListDelete_Sq(SqList &L,int i,ElemType &e){ //刪除第i個元素並用e帶回 i介於1與L.length之間 if(i<1||i>L.length) return ERROR; if(!L.elem) return OVERFLOW; ElemType *p=&L.elem[i],*q=L.elem+L.length-1; e=*(p-1); while(p<=q) *(p-1)=*p++; L.length--; return OK; }
在順序表的第i個位置插入e。
int ListInsert_Sq(SqList &L,int i,ElemType e){
//在順序表的第i個位置插入e
if(i<1||i>L.length+1) //插入位置不合法
return ERROR;
if(L.length==L.ListSize){
L.elem=(ElemType *)realloc(L.elem,(L.ListSize+LISTINCREMENT)*sizeof(ElemType));//如果表容量不夠
L.ListSize+=LISTINCREMENT;
}
ElemType *p=&L.elem[i-1],*q=L.elem+L.length-1;
while(q>=p) //插入位置元素右移
*(q+1)=*q--;
*p=e;
L.length++; //表加長
return OK;
}
輸出順序表:
void OutputElem(ElemType e)
{
printf("%d\n",e);
}
void ListPrint_Sq(SqList &L){
//依次輸出L中的各個元素
if(L.length==0)
printf("空表");
else{
for(int i=0;i<L.length;++i)
OutputElem(L.elem[i]);
}
}
銷燬表L:
status DestroyList_Sq(SqList &L){
//銷燬表L
if(L.elem)
free(L.elem);
L.elem=NULL;
L.length=0;
L.ListSize=0;
return OK;
}
清空表:
status ClearList_Sq(SqList &L){
// 清空表L
L.length=0;
return OK;
}
用e帶回i位置的元素,如果i不合法返回ERROR
status GetElem_Sq(SqList &L,int i,ElemType &e){
//用e帶回i位置的元素,如果i不合法返回ERROR
if(L.length==0)
return ERROR;
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];
return OK;
}
更新第i個位置元素為e i不合法返回ERROR.
status PutElem_Sq(SqList &L,int i,ElemType e){
//更新第i個位置元素為e i不合法返回ERROR
if(L.length==0)
return ERROR;
if(i<1||i>L.length)
return ERROR;
L.elem[i-1]=e;
return OK;
}
返回L中第一個與e滿足關係compare()的位序,不存在則返回0.
status compare(ElemType e1,ElemType e2)
{
return e1==e2;
}
int LocateElem_Sq(SqList L,ElemType e,status (*compare)(ElemType,ElemType)){
//返回L中第一個與e滿足關係compare()的位序,不存在則返回0
ElemType *p=L.elem,*q=L.elem+L.length-1;
while(p<=q){
if(compare(*p,e))
return p-L.elem+1;
p++;
}
return 0;
}
對L中每個元素執行函式visit().
status visit(ElemType &e){
e+=10;
return OK;
}
status ListTraverse_Sq(SqList &L,status (*visit)(ElemType &)){
//對L中每個元素執行函式visit()
ElemType *p=L.elem,*q=L.elem+L.length-1;
while(p<=q)
visit(*p++);
return OK;
}
判斷L是否為空
bool ListEmpty_Sq(SqList &L){
//判斷L是否為空
if(!L.length)
return TRUE;
return FALSE;
}
返回L的長度
int ListLength_Sq(SqList &L){
//返回L的長度
return L.length;
}
若cur_e是L中的元素且不是第一個,就返回他的前驅,否則pre_e未定義 操作失敗.
status PriorElem_Sq(SqList &L,ElemType cur_e,ElemType & pre_e){
//若cur_e是L中的元素且不是第一個,就返回他的前驅,否則pre_e未定義 操作失敗
int i=LocateElem_Sq(L,cur_e,compare);
if(i<=1) return ERROR;
pre_e=L.elem[i-2];
return OK;
}
若cur_e是L中的元素且不是最後一個,就返回他的後驅,否則pre_e未定義 操作失敗.
status NextElem_Sq(SqList &L,ElemType cur_e,ElemType & pre_e){
//若cur_e是L中的元素且不是最後一個,就返回他的後驅,否則pre_e未定義 操作失敗
int i=LocateElem_Sq(L,cur_e,compare);
if(i<1||i>L.length-1) return ERROR;
pre_e=L.elem[i];
return OK;
}
原順序表從小到大排好了序,插入一個數使之依然有序.
status ListInsert_Sorted(SqList &L,ElemType e){
//插入一個數依然有序
if(L.length>=L.ListSize)
L.elem=(ElemType*)realloc(L.elem,(L.length+LISTINCREMENT)*sizeof(ElemType));
ElemType *q=L.elem+L.length-1;
while(q>=L.elem&&*q>e){
*(q+1)=*q;
q--;
}
*(q+1)=e;
L.length++;
return OK;
}
表的倒序。
status ListInverse(SqList &L){
//倒敘
ElemType e,*p=L.elem,*q=L.elem+L.length-1;
while(p<q){
e=*p;
*p=*q;
*q=e;
p++;
q--;
}
return OK;
}