資料結構:順序表及其函式的實現
阿新 • • 發佈:2021-01-30
資料結構:順序表及其函式的實現
本文順序表採用動態陣列的方法來進行初始化。主要實現了以下一些功能。
函式功能:
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發表文章~