1. 程式人生 > >資料結構-順序表

資料結構-順序表

線性結構的特點是:在資料元素的非空有限集中,存在一個唯一的被稱作為第一個的資料元素,存在唯一的一個被稱作最後一個的資料元素,除第一個外,集合中的每個資料元素均只有一個前驅,出最後一個外,集合中每個資料元素均只有一個後繼。

關係採用順序映像,形成順序儲存結構,稱之為順序表。

編譯環境: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;
}