首頁 > 軟體

C++順序表的基本操作實現

2022-02-11 10:02:11

1.順序表的定義

線性表的順序儲存又稱順序表。它是用一組地址連續的儲存單元依次儲存線性表中的資料元素,從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰。第1個元素儲存線上性表的起始位置,第i個元素的儲存位置後面緊鄰這儲存的是第i+1個元素,稱 i 為元素ai線上性表中的位序。因此,順序表的特點是表中元素的邏輯順序和物理順序相同。

    假定線性表中的元素型別為ElemType,則線性表的順序儲存為

#define ElemType int
#define MaxSize 50  //定義線性表的最大長度
typedef struct{
    ElemType data[MaxSize] //順序表的元素
    int length; //順序表的當前長度
}SqList;   //順序表的型別定義

此時,一維陣列是靜態分配,由於陣列的大小和空間事先已經固定,一單空間佔滿,再加入新的資料就會產生溢位,進而導致程式崩潰。

2.順序表上基本操作的實現

(1)初始化操作
初始化順序表。構造一個空的線性表。

void IniteList(SqList &L){
	memset(L.data,0,sizeof(L)); //將順序表L中的資料初始化為0 
	L.length = 0;
} 

注意: “&”表示C++中的應用呼叫,後面就不一一贅述了!
(2)建立順序表

bool CreateList(SqList &L,int n){
	if(n<0||n>MaxSize){  //建立順序表的個數不合理
		return false;
	}
	L.length = n;
	cout << "請依次輸出" << n <<"個數並用空格隔開:"; 
	for(int i=0;i<L.length;i++){
		cin >> L.data[i];
	}
	return true;
} 

(3)插入操作
在順序表L的第i(1 <= i <= L.length+1)個位置插入新元素e。若 i 的輸入不合法,則返回false,表示插入失敗;否則,將第 i 個元素及其後的所有元素依次往後移動一個位置,騰出一個空位置插入新元素e,順序表的長度加1,插入成功,返回true.

bool InserteList(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1){
		return false;
		cout << "插入位置不合法!"; 
	}
	if(L.length == MaxSize){
		return false;
		cout << "當前順序表空間已滿!";
	}
	for(int j=L.length;j>=i;j--){  //先移動最後一個元素,在移動其他的
		L.data[j]=L.data[j-1];//將i以及i之後的所有元素都往後移 
	}
	L.data[i-1]=e; //注意:先後移完之後在插入 
	L.length++;
	return true;
}

注意: 區別順序表的位序和陣列下標。前者是從1開始,後者是從0開始。
(4)刪除操作
刪除順序表L中的第 i (1 <= i <= L.length) 個位置的元素,用應用變數e返回。若 i 的輸入不合法,則返回 false;否則,將被刪除元素賦給參照變數e,並將第 i + 1 個元素及其後的所有元素依次往前移動一個位置,返回true。

bool DeleteList(SqList &L,int i,ElemType e){
	if(i<1||i>L.length){
		return false;
	}
	e=L.data[i-1]; //將所刪除的元素賦值給 e
	for(int j=i;j<L.length;j++){  //j = i,在陣列中下標表示就是所刪除元素後面第一個元素
		L.data[j-1]=L.data[j]; //將i之後的元素都往前移 
	}
	L.length--;
	return true;
}

(5)查詢(按值查詢)
在順序表L中查詢第一個元素值等於 e 的元素,並將其返回。

int Search1_List(SqList &L,ElemType e){
	int j=0;
	for(int i=0;i<L.length;i++){
		if(L.data[i] == e){
			j=i+1;   //下標為 i 的元素值等於 e ,將其返回其位序 i+1
		}
	}
	return j;
} 

(6)查詢(按序查詢)
在順序表中返回指定位置的元素。

int Search2_List(SqList &L,int i){
	if(i<1||i>L.length){
		cout << "查詢位置不合理!";
	}
	return L.data[i-1];
} 

(7)列印操作
按前後順序列印線性表L中的所有值。

void PrintList(SqList L){
	cout << "順序表中所有元素為:";
	for(int j=0;j<L.length;j++){
		cout << L.data[j] << " ";
	} 
	cout <<endl;
} 

完整程式碼如下:

/* 建立順序表 實現插入,刪除,按值查詢,按序查詢,列印順序表 */
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<string.h>
#define ElemType int
#define MaxSize 100
using namespace std;
typedef struct{
	ElemType data[MaxSize];
	int length; //數序標的長度 
}SqList;
//初始化順序表
void IniteList(SqList &L){
	memset(L.data,0,sizeof(L)); //將順序表L中的資料初始化為0 
	L.length = 0;
} 
//建立順序表函數 
bool CreateList(SqList &L,int n){
	if(n<0||n>MaxSize){
		return false;
	}
	L.length = n;
	cout << "請依次輸出" << n <<"個數並用空格隔開:"; 
	for(int i=0;i<L.length;i++){
		cin >> L.data[i];
	}
	return true;
} 
//順序表L中在第i個位插入元素
bool InserteList(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1){
		return false;
		cout << "插入位置不合法!"; 
	}
	if(L.length == MaxSize){
		return false;
		cout << "當前順序表空間已滿!";
	}
	for(int j=L.length;j>=i;j--){
		L.data[j]=L.data[j-1];//將i以及i之後的所有元素都往後移 
	}
	L.data[i-1]=e; //注意:先後移完之後在插入 
	L.length++;
	return true;
}
//刪除順序表L中第i個元素的位置上 
bool DeleteList(SqList &L,int i,ElemType e){
	if(i<1||i>L.length){
		return false;
	}
	e=L.data[i-1]; //將所刪除的元素賦值給 e
	for(int j=i;j<L.length;j++){
		L.data[j-1]=L.data[j]; //將i之後的元素都往前移 
	}
	L.length--;
	return true;
}
//查詢(按值查詢)函數
int Search1_List(SqList &L,ElemType e){
	int j=0;
	for(int i=0;i<L.length;i++){
		if(L.data[i] == e){
			j=i+1;
		}
	}
	return j;
} 
//查詢(按序查詢)函數
int Search2_List(SqList &L,int i){
	if(i<1||i>L.length){
		cout << "查詢位置不合理!";
	}
	return L.data[i-1];
} 
//列印輸出順序表函數
void PrintList(SqList L){
	cout << "順序表中所有元素為:";
	for(int j=0;j<L.length;j++){
		cout << L.data[j] << " ";
	} 
	cout <<endl;
} 
//建立
void Create(SqList &L){
	int n;bool flag;
	cout << "請輸入所建立順序表中元素的個數:";
	cin >> n;
	flag = CreateList(L,n);
	if(flag){
		cout << "建立成功!";
		PrintList(L);
	}
	else
	  cout << "建立失敗!"; 
} 
//插入 
void Insert(SqList &L){
	int i; 
	int e;
	bool flag;
	cout << "請輸入插入位置和所插元素:";
	cin >> i >> e;
	flag = InserteList(L,i,e);
	if(flag){
		cout << "插入成功!n" << "插入後" ;
		PrintList(L);
	}
	else 
	  cout << "插入失敗!";
}
//刪除 
void Delete(SqList &L){
	int i; int e; bool flag;
	cout << "請輸入刪除位置:";
	cin >> i;
	flag = DeleteList(L,i,e);
	if(flag){
		cout << "刪除成功!" << "刪除後";
		PrintList(L);
	}
	else 
	  cout << "刪除位置不合法!";
}
//按值查詢
void Search_1(SqList &L){
	int e,a;
	cout << "請輸入要查詢的值:";
	cin >> e;
	a = Search1_List(L,e);
	cout << e << "在順序表L中的位置為:"<< a << endl;
} 
//按序查詢
void Search_2(SqList &L){
	int i;
	cout << "請輸入要查詢的位置:n";
	cin >> i;
	int j = Search2_List(L,i);
	cout << "順序表L第" << i << "個位置上的元素為" << j; 
} 
int main(){
	SqList L;
	IniteList(L);
	Create(L);
	Insert(L);
	Delete(L);
	Search_1(L);
	Search_2(L);
	return 0;
}

編譯器DEVC++:
編譯結果:

總結

到此這篇關於C++順序表的基本操作實現的文章就介紹到這了,更多相關C++順序表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com