實驗性質:設計性實驗
要求
編程實現順序表的以下基本操作:建立順序表,修改順序表,插入順序表,刪除順序表。
採用順序表結構編程實現:兩個集合的運算:交集/並集/差集。
實驗目的
通過該實驗,深入理解順序表的邏輯結構、物理結構等概念,掌握順序表基本操作的編程實現,注意順序表插入、刪除等操作過程中數據元素的移動現象,學生編寫程序時,要考慮程序的健壯性,熟練掌握通過函數參數返回函數結果的辦法。
實驗內容
編程實現順序表下教材第二章定義的線性表的基本操作,最好用菜單形式對應各個操作,使其變成一個完整的小軟件。
參考界面
驗收/測試用例
通過菜單調用各個操作,測試點:
-
插入數據(位置, 數據),要測插入位置不合法的情況(0,1)、(2,1),正確插入4個數據(1,2)、(1,1)、(3,3)
-
顯示順序表中的數據,屏幕輸出1, 2, 3;
-
判空,屏幕輸出順便表非空;
-
順便表長度,屏幕輸出3;
-
獲取指定位置元素,要測指定位置在【1,3】範圍之外的情況和之內的情況;
-
定位,輸入:4, 輸出:不存在,輸入2,輸出位置爲2;
-
求直接前驅,要測求第一個元素的前驅、不存在順序表中的元素的直接前驅,其他元素的直接前驅;
-
求直接後繼,要測最後一個元素的後繼、不存在順序表中的元素的直接後繼,其他元素的直接後繼;
-
刪除,要測位置在【1,3】範圍之外的情況和之內的情況;
-
清空操作後再測長度;
代碼
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAXSIZE 10
typedef int status;
typedef struct //定義結構體
{
int *elem;
int length;
}SqList;
SqList L; //聲明變量
void InitList(SqList &L); //順序表的初始化
void ListLength(SqList &L); //順序表的長度
void EmptyList(SqList &L); //判斷順序表是否爲空
void ClearList(SqList &L); //清空順序表
void PointList(SqList &L,int i); //獲取指定位置的元素
void BeforList(SqList &L,int i); //求前驅
void AfterList(SqList &L,int i); //求後繼
void InsertList(SqList &L,int i,int x);//順序表的插入
void DeleteList(SqList &L,int i); //刪除指定位置的元素
void Display(SqList &L); //顯示順序表的結構
void Postion(SqList &L,int i); //定位
void Menu(); //文字菜單提示信息
int main()
{
Menu();
InitList(L);
int h,k; //獲取輸入的指定位置和插入數據的元素
int i; //輸入的數字
cout<<"請輸入操作代碼:";
cin>>i;
while(true)
{
switch(i)
{
case 1:
ClearList(L);
break;
case 2:
EmptyList(L);
break;
case 3:
ListLength(L);
break;
case 4:
cout<<"輸入要操作的位置:";
cin>>h;
PointList(L,h);
break;
case 5:
cout<<"輸入要操作的位置:";
cin>>h;
BeforList(L,h);
break;
case 6:
cout<<"輸入要操作的位置:";
cin>>h;
AfterList(L,h);
break;
case 7:
cout<<"輸入要操作的位置:";
cin>>h;
cout<<"輸入要插入的值:";
cin>>k;
InsertList(L,h,k);
break;
case 8:
cout<<"輸入要操作的位置:";
cin>>h;
DeleteList(L,h);
break;
case 9:
Display(L);
break;
case 10:
cout<<"輸入要操作的值:";
cin>>k;
Postion(L,k);
break;
default:
if(i<0)
return 0;
else
{
cout<<"輸入的位置非法,請重新輸入";
break;
}
}
cout<<"請輸入操作代碼:";
cin>>i;
}
return 0;
}
void InitList(SqList &L)//初始化
{
L.elem = new int(MAXSIZE);
if(!L.elem)
cout<<"初始化有誤"<<endl;
L.length=0;
}
void ListLength(SqList &L)//順序表的長度
{
cout<<"順序表的長度爲"<<L.length<<endl;
}
void EmptyList(SqList &L)//判斷順序表是否爲空
{
if(L.length==0)
cout<<"順序表爲空"<<endl;
else
{
cout<<"順序表非空,長度爲"<<L.length<<endl;
}
}
void ClearList(SqList &L)//清空順序表
{
L.length=0;
cout<<"順序表已清空"<<endl;
}
void PointList(SqList &L,int i)
{
if(i<=0||i>L.length)
{
cout<<"輸入的數字非法"<<endl;
}
else
{
cout<<"第"<<i<<"個元素爲"<<L.elem[i-1]<<endl;
}
}
void BeforList(SqList &L,int i)//求前驅
{
if(i<=0||i>L.length)
{
cout<<"輸入數字非法"<<endl;
}
else if(i==1)
{
cout<<"第一個元素不存在前驅"<<endl;
}
else
{
cout<<"第"<<i<<"個元素的前驅爲"<<L.elem[i-2]<<endl;
}
}
void AfterList(SqList &L,int i)//求後繼
{
if(i<=0||i>L.length)
{
cout<<"輸入數字非法"<<endl;
}
else if(i==L.length)
{
cout<<"最後一個元素不存在後繼"<<endl;
}
else
{
cout<<"第"<<i<<"個元素的後繼爲"<<L.elem[i]<<endl;
}
}
void InsertList(SqList &L,int i,int x)//插入順序表
{
if(i<=0||i>L.length+1)
{
cout<<"輸入的位置非法"<<endl;
}
else
{
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j]; //從第i+1個元素開始都往後移一位
L.elem[i-1]=x; //第i個元素設爲x
++L.length;
cout<<"插入元素成功"<<endl;
}
}
void DeleteList(SqList &L,int i)//刪除指定元素
{
if(i<=0||i>L.length)
{
cout<<"輸入的位置非法"<<endl;
}
else
{
for(int j=i;j<=L.length;j++)
{
L.elem[j-1]=L.elem[j]; //從第i+1個元素起依次往前移一個位置
}
--L.length;
cout<<"成功刪除元素"<<endl;
}
}
void Display(SqList &L)//顯示順序表
{
if(L.length==0)
{
cout<<"當前順序表爲空表"<<endl;
}
else
{
cout<<"順序表爲:";
for(int j=0;j<L.length-1;j++)
{
cout<<L.elem[j]<<",";
}
cout<<L.elem[L.length-1];
cout<<endl;
}
}
void Postion(SqList &L,int i)
{
bool a = false;//判斷是否能找到
for(int j=0;j<L.length;j++)
{
if(i==L.elem[j])
{
a=true;
cout<<"元素所在位置爲:"<<j+1<<endl;
break;
}
}
if(!a)
cout<<"不存在"<<endl;
}
void Menu()
{
cout << "1-----清空線性表" << endl;
cout << "2-----判斷線性表是否爲空" << endl;
cout << "3-----求線性表長度" << endl;
cout << "4-----獲取線性表指定位置元素" << endl;
cout << "5-----求前驅" << endl;
cout << "6-----求後繼" << endl;
cout << "7-----在線性表指定位置插入元素 "<< endl;
cout << "8-----刪除空線性表指定位置元素" << endl;
cout << "9-----顯示線性表" << endl;
cout << "10----定位" << endl;
cout << " 退出,輸入一個負數!" << endl;
}
寫在最後
本文章僅供個人複習使用,如有錯誤,請聯繫我更正。