1. 程式人生 > 其它 >資料結構:順序表及其函式的實現

資料結構:順序表及其函式的實現

技術標籤:順序表資料結構

資料結構:順序表及其函式的實現

本文順序表採用動態陣列的方法來進行初始化。主要實現了以下一些功能。

函式功能:

void InitList(Sqlist &L); 初始化表。構造一個空的線性表

void IncreaseSize(Sqlist &L, int len);//增加動態陣列長度

void DestroyList(Sqlist &L);//銷燬操作。銷燬L並釋放L所佔用的記憶體空間

int GetLength(Sqlist L);//求表長;即L中資料元素的個數

int LocateElem(Sqlist L, int e);//按值查詢元素,找具有給定關鍵字值的元素

int GetElem(Sqlist L, int i);//按位查詢元素,找到表中第i個元素的值

void ListInsert(Sqlist &L, int i, int e);//插入操作。在表中第i個位置插入指定元素e

void ListDelete(Sqlist &L, int i, int &e);//刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值

void PrintList(Sqlist L);//輸出操作。按前後順序輸出L中所有的值

int Empty(Sqlist L);//判空操作。

下面展示程式碼。

///順序表 :基本全是純C語言  引用部分& 和 輸出部分是C++   C語言中可以利用指標修改值 沒有引用 
#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define INITSIZE 5 #define ListIncreament 10 typedef struct Sqlist{ int *data;//儲存空間基地址 int MaxSize;//當前分配的儲存容量 int length;//當前表長 }Sqlist; void InitList(Sqlist &L);//初始化表。構造一個空的線性表 void IncreaseSize
(Sqlist &L, int len);//增加動態陣列長度 void DestroyList(Sqlist &L);//銷燬操作。銷燬L並釋放L所佔用的記憶體空間 int GetLength(Sqlist L);//求表長;即L中資料元素的個數 int LocateElem(Sqlist L, int e);//按值查詢元素,找具有給定關鍵字值的元素 int GetElem(Sqlist L, int i);//按位查詢元素,找到表中第i個元素的值 void ListInsert(Sqlist &L, int i, int e);//插入操作。在表中第i個位置插入指定元素e bool ListDelete(Sqlist &L, int i, int &e);//刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值 void PrintList(Sqlist L);//輸出操作。按前後順序輸出L中所有的值 int Empty(Sqlist L);//判空操作。 void InitList(Sqlist &L){ //動態初始化 L.data = (int *)malloc(INITSIZE * sizeof(int)); if(!L.data) return ;//申請記憶體失敗 L.MaxSize = INITSIZE; L.length = 0; } void DestroyList(Sqlist &L){ int *p; p = L.data; free(p); } //增加動態陣列長度 void IncreaseSize(Sqlist &L, int len){ int *p = L.data; L.data = (int *)malloc(sizeof(int) * (L.MaxSize + len)); if(!L.data) return ;//申請記憶體失敗 for(int i = 0; i < L.length; i++){ L.data[i] = p[i]; } L.MaxSize += len; free(p); } //插入操作。在表中第i個位置插入指定元素e // 1 <= i <= n void ListInsert(Sqlist &L, int i, int e){ if(i < 1 || i > L.length + 1){ return ; } if(L.length >= L.MaxSize){ int *newbase; newbase = (int *)realloc(L.data, sizeof(int)* (L.MaxSize + ListIncreament)); if(!newbase) return ; //申請記憶體失敗 L.data = newbase; L.MaxSize += ListIncreament; } //以上7行程式碼可以寫成下面這樣 (待驗證) /* if(L.length >= L.MaxSize){ IncreaseSize(L, ListIncreament); } */ int *q;//q為插入位置 q = &(L.data[i - 1]); for(int *p = &(L.data[L.length - 1]); p >= q; p--){ *(p+1) = *p; } *q = e; L.length++; } int GetLength(Sqlist L){ return L.length; } //按值查詢元素,找具有給定關鍵字值的元素 int LocateElem(Sqlist L, int e){ for(int i = 0; i < L.length; i++){ if(L.data[i] == e){ return i+1; } } return -1; } //按位查詢元素,找到表中第i個元素的值 int GetElem(Sqlist L, int i){ return L.data[i - 1]; } //刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值 bool ListDelete(Sqlist &L, int i, int &e){ if(i < 1 || i > L.length){ return false;//i的資訊錯誤 } e = L.data[i - 1]; for(int j = i; j < L.length; j++){ L.data[j - 1] = L.data[j]; } --L.length; return true; } //輸出操作。按前後順序輸出L中所有的值 void PrintList(Sqlist L){ for(int i = 0; i <L.length; i++){ cout<<L.data[i]<<" "; //用這個方法是方便輸出 若data的資料型別改變 也不用改變輸出程式碼 } return ; } //判空操作。 int Empty(Sqlist L){ if(L.length == 0){ return 1; } else{ return 0; } }

下面是在主函式中的實現:(個人加入了一些選單功能,程式碼看著有些笨拙,方便了解實現功能…)

// An highlighted block
int main()
{
	Sqlist L;
	int num;
	InitList(L);
	ListInsert(L, 1, 1);
	ListInsert(L, 2, 2);
	ListInsert(L, 3, 3);
	ListInsert(L, 4, 4);
	ListInsert(L, 5, 5);

	cout<<"\n選單功能如下: \n";
	cout<<"1--------求表長;即L中資料元素的個數"<<endl;
	cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
	cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
	cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
	cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
	cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
	cout<<"7--------判空操作"<<endl;
	cout<<"8--------退出程式"<<endl;
	
	while(1){
		cout<<"請輸入選項:"<<endl;
		cin>>num;
		switch(num){
			case 1:
			
				cout<<"表長度為:"<<GetLength(L)<<endl;;
				
				break;
				
				case 2:
					int a;
					system("cls");
					cout<<"選單功能如下: \n";
					cout<<"1--------求表長;即L中資料元素的個數"<<endl;
					cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
					cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
					cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
					cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
					cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
					cout<<"7--------判空操作"<<endl;
					cout<<"8--------退出程式"<<endl;
					cout<<"請輸入查詢的值: \n";
					cin>>a; 
					cout<<"該值的位數是: "<<LocateElem(L, a)<<endl;;
					break;
					
					case 3:
						int b;
						system("cls");
						cout<<"選單功能如下: \n";
						cout<<"1--------求表長;即L中資料元素的個數"<<endl;
						cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
						cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
						cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
						cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
						cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
						cout<<"7--------判空操作"<<endl;
						cout<<"8--------退出程式"<<endl;
					    cout<<"請輸入查詢的值: \n";
						cout<<"請輸入要查詢元素的位數: \n";
						cin>>b;
						cout<<"該元素的值是: "<<GetElem(L, b)<<endl;
						break;
						
						case 4:
							int c, d;
							system("cls");
							cout<<"選單功能如下: \n";
							cout<<"1--------求表長;即L中資料元素的個數"<<endl;
							cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
							cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
							cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
							cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
							cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
							cout<<"7--------判空操作"<<endl;
							cout<<"8--------退出程式"<<endl;
							cout<<"請輸入查詢的值: \n";
							cout<<"請輸入要插入元素的位數及插入元素的值: \n";
							cin>>c>>d;
							ListInsert(L, c, d);
							break;
							
							case 5:
								int o, f;
							system("cls");
							cout<<"選單功能如下: \n";
							cout<<"1--------求表長;即L中資料元素的個數"<<endl;
							cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
							cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
							cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
							cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
							cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
							cout<<"7--------判空操作"<<endl;
							cout<<"8--------退出程式"<<endl;
				
								cout<<"請輸入要刪除元素的位數: \n";
								cin>>o;
								if(ListDelete(L, o, f))		cout<<"刪除元素的值為:"<<f<<endl;
								else cout<<"非法輸入!\n";
								break;
								
								case 6:
							system("cls");
							cout<<"選單功能如下: \n";
							cout<<"1--------求表長;即L中資料元素的個數"<<endl;
							cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
							cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
							cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
							cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
							cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
							cout<<"7--------判空操作"<<endl;
							cout<<"8--------退出程式"<<endl;
					
									cout<<"列表中所有元素: "<<endl;
									PrintList(L);
									cout<<endl;
									break;
									
									case 7:
										system("cls");
										cout<<"選單功能如下: \n";
										cout<<"1--------求表長;即L中資料元素的個數"<<endl;
										cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
										cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
										cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
										cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
										cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
										cout<<"7--------判空操作"<<endl;
										cout<<"8--------退出程式"<<endl;
									
										int g;
										g = Empty(L);
										if(g) cout<<"表為空 \n";
										else cout<<"表為不空 \n";
									  break;
									  
									  case 8:
									  		system("cls");
											cout<<"選單功能如下: \n";
											cout<<"1--------求表長;即L中資料元素的個數"<<endl;
											cout<<"2--------按值查詢元素,找具有給定關鍵字值的元素"<<endl;
											cout<<"3--------按位查詢元素,找到表中第i個元素的值"<<endl;
											cout<<"4--------插入操作。在表中第i個位置插入指定元素e"<<endl;
											cout<<"5--------刪除操作。刪除表中第i個位置的元素,並用e返回刪除元素的值"<<endl;
											cout<<"6--------輸出操作。按前後順序輸出L中所有的值"<<endl;
											cout<<"7--------判空操作"<<endl;
											cout<<"8--------退出程式"<<endl;
				
									  	exit(0); 
									  	break;
									  	
									  	default:
									  		cout<<"非法輸入!"<<endl;
									  	
		} 
	}
	
	return 0;
}

下面是執行結果:
按照選項操作即可

上機試試就知道啦!
本人第一次在CSDN發表文章~