「數據結構」順序表操作方法

以下是順序表的基本操作,以待日後查閱。

頭文件的引入和一些聲明

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define OK 1

typedef int Status;
typedef int ElemType; 

typedef struct{
	ElemType *elem;
	int length;
	int listsize;
}SqList;

順序表的初始化操作

Status InitList_Sq(SqList &L){
	// 構造空表
	// 分配預定義大小的存儲空間
	L.elem = (ElemType * ) malloc (LIST_INIT_SIZE * sizeof(ElemType));
	if(!L.elem)	exit(OVERFLOW);// 如果空間分配失敗
	L.length=0;// 置當前順序表的長度爲0
	L.listsize=LIST_INIT_SIZE;// 置當前分配的存儲空間容量爲LIST_INIT_SIZE的值 
	return OK;
}

順序表的創建操作

Status CreateList_Sq(SqList &L){
	// 建立有元素的表 
	printf("Number of data:\n");
	scanf("%d",&L.length);
	printf("Input the data:\n");
	for(int i=0;i<L.length;i++){
		scanf("%d",&L.elem[i]);
	}
	return OK;
} 

順序表的插入操作(一)

Status ListInsert(SqList &L, Elemtype e){
	// 在順序表的L的第i個元素之前插入新的元素e,其中1<=i<=L.length+1
	// 這裏的數據元素的訪問方式是通過指針來間接訪問
	ElemType *newbase, *p, *q;
	if(i<1 || i>L.length+1)// 如果插入位置不合法
		return ERROR;
	if(L.length>=L.listsize){
		newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(Elemtype));
		if(!newbase)// 空間分配失敗
			exit(OVERFLOW);
		L.elem=newbase;// 修改增加空間之後的基址
		L.listsize+=LISTINCREMENT;// 修改增加空間之後的存儲空間容量
	}
	q=&(L.elem[i-1]);// q指示插入位置
	for(p=&(L.elem[L.length-1]);p>=q;--p)// p始終指示待移動的位置,此處爲從最後開始每個向後移
		*(p+1)=*p;
	*q=e;// e插入騰出的空
	++L.length;// 表長加一
	return OK;
}

順序表的插入操作(二)

Status ListInsert_Sq(SqList &L, Elemtype e){
	// 在順序表的L的第i個元素之前插入新的元素e,其中1<=i<=L.length+1
	// 這裏的數據元素的訪問方式是通過數組來直接訪問
	ElemType *newbase, *p, *q;
	if(i<1 || i>L.length+1)// 如果插入位置不合法
		return ERROR;
	if(L.length>=L.listsize){
		newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)// 空間分配失敗
			exit(OVERFLOW);
		L.elem=newbase;// 修改增加空間之後的基址
		L.listsize+=LISTINCREMENT;// 修改增加空間之後的存儲空間容量
	}
	for(int j=L.length-1;j>=i-1;j--)// 將插入位置之後的所有元素後移一位
		L.elem[j+1]=L.elem[j];
	L.elem[i-1]=e;// e插入騰出的空
	L.length++;// 表長加一
	return OK;
}

順序表的刪除操作

Status ListDelete_Sq(SqList &L){
	// 刪除順序表L中的第i個元素,並用e返回其值,其中1<=i<=L.length
	ElemType *p, *q;
	if((i<1)||(i>L.length-1))// 如果位置不合法
		return ERROR;
	p=&(L.elem[i-1]);// p始終指示被刪除元素的位置
	e=*p;// 用e保存被刪除元素
	q=L.elem+L.length-1;// q指示表爲元素的位置
	for(++p;p<=q;++p)// 
		*(p-1)=*p;// 刪除元素之後,所有後面的元素前移
	--L.length;// 表長減一
	return OK;
} 

順序表的查找操作

Status LocateElem_Sq(SqList &L, ElemType e){
	// 查找線性表L中值爲e的數據元素,並返回其在表中首次出現時的位序號;若表中沒有,則返回0
	int i;
	for(i=1;i<L.length&&L.elem[i-1]!=e;i++);
	if(i<=L.length)
		return i;
	else
		return 0;
}

順序表的輸出操作

Status Print_Sq(SqList &L){
	// 輸出表L中各數據元素值
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
	printf("\n");
}

主函數

int main(){
	SqList L;
	// 加入相應的模塊
} 

一些其他算法

就地逆置

Status Inverse_Sq(SqList &L){
	// 順序表的就地逆置 
	int temp;
	for(int i=0;i<L.length/2;i++){
		temp=L.elem[i];
		L.elem[i]=L.elem[L.length-i-1];
		L.elem[L.length-i-1]=temp;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章