//數據結構學什么?是解決非數值型數據計算問題的,那要建模,建什么模?ADT:1是對象建模,一般需要寫結構體,處理元素是原子類型的就無需定義建模;2是關系建模,數據元素間的關系要么1對1,1對多,多對多,概括這些模型名曰:線性表,棧,隊列等,就是2-6章的標題;3是操作建模,就是對象及關系上的函數。從實驗一到實驗十二都是這樣來寫代碼的,心中要有這三個建模,按順序寫,心有所想來寫,不要操課本代碼,當然不會時可以參考。
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 // 線性表存儲空間的初始分配量
typedef int Status;
//00定義兩個:數據元素為int 原子類型,數據結構含兩個域的結構體變量表示。
//定義數據元素
typedef int ElemType;
//定義數據結構
typedef struct {
ElemType *elem; // 存儲空間基址,指針,故初始化需開辟空間new一個數組
int length; // 當前表的長度
}SqList;
//01初始化一個線性表
Status InitSqList(SqList &L);
//02創建一個包含n個正整數值的線性表(線性表的長度n和表中元素的值隨機輸入)
Status CreateSqList(SqList &L);
//03將一個數x插在第i個元素前
Status SqListInsert(SqList &L, int i, ElemType x);
//04刪除第i個元素,並在刪除結束后輸出刪除元素的值
Status SqListDelete(SqList &L, int i);
//05查找指定元素e是否在線性表中存在,若存在返回此元素的位序,否則返回0
int LocateElem(SqList L, ElemType e);
//06查找指定位置元素的值並輸出
Status Getelem(SqList L, int i, ElemType &e);
//07輸出線性表中所有元素
Status TraverseSqList(SqList L);
//08 合並兩個順序表,將LB合並到LA中(重復元素不合並進去)
Status SqList_Merge(SqList &LA, SqList LB);
int main()
{
ElemType e, x;
int i, k;
SqList L;
do {
cout << "\n=========順序表的操作===========";
cout << "\n 1.初始化順序表";
cout << "\n 2.創建順序表";
cout << "\n 3.在第i個位置前插入元素x";
cout << "\n 4.刪除元素";
cout << "\n 5.查找指定元素位置";
cout << "\n 6.查找指定位置元素";
cout << "\n 7.遍歷當前順序表";
cout << "\n 8.順序表合並";
cout << "\n 0.結束程序運行";
cout << "\n================================";
cout << "\n 請輸入您的選擇(1,2,3,4,5,6,7,0)";
cin >> k;
switch (k)
{
case 1:
if (InitSqList(L))
cout << "初始化成功!";
else
cout << "初始化失敗!";
break;
case 2:
if (CreateSqList(L))
cout << "創建成功!";
else
cout << "創建失敗!";
break;
case 3:
cout << "請輸入插入元素的位置i及值x:";
cin >> i >> x;
if (SqListInsert(L, i, x))
cout << "插入成功!";
else
cout << "插入失敗!";
//TraverseSqList(L);
break;
case 4:
cout << "請輸入要刪除元素的位置i:";
cin >> i;
SqListDelete(L, i);
//TraverseSqList(L);
break;
case 5:
cout << "請輸入要查找指定元素e:";
cin >> e;
cout << "該元素的位置是:" << LocateElem(L, e) << endl;
break;
case 6:
cout << "請輸入要查找元素的位置:";
cin >> i;
Getelem(L, i, e);
cout << "第" << i << "個元素值是:" << e << endl;
break;
case 7:
cout << "當前線性表中的元素為:";
TraverseSqList(L);
break;
case 8:
SqList LA, LB;
InitSqList(LA);
InitSqList(LB);
cout << "請創建順序表LA:";
CreateSqList(LA);
cout << "請創建順序表LB:";
CreateSqList(LB);
cout << "LB合並到LA中(重復元素不合並進去):";
SqList_Merge(LA,LB);
TraverseSqList(LA);
break;
case 0:
break;
default:
cout << "無效選項,請重新輸入!" << endl;
}/*switch*/
} while (k != 0);
system("pause");
return 0;
}/*main*/
//01初始化一個線性表L
Status InitSqList(SqList &L)
{
L.elem = new ElemType[LIST_INIT_SIZE];
if (!L.elem) exit(OVERFLOW); //儲存空間分配失敗
L.length = 0; //將線性表的表長置為0
return OK;
}
//02創建一個包含n個正整數值的線性表(線性表的長度n和表中元素的值隨機輸入)
Status CreateSqList(SqList &L)
{
if (!L.elem)InitSqList(L); //線性表不存在則初始化一個線性表
cout << "請輸入線性表的長度n:";
int len;
cin >> len;
cout << "請輸入 " << len << " 個正整數:";
int data, i;
for (i = 0; i < len; i++)
{
cin >> data;
L.elem[i] = data;
}
L.length = i;
return OK;
}
//03將一個數x插在第i個元素前
Status SqListInsert(SqList &L, int i, ElemType x)
{
if (!L.elem || L.length == LIST_INIT_SIZE)
{
cout << "表不存在或當前存儲已滿";
return ERROR; //表不存在或當前存儲已滿
}
if ((i<1) || (i>L.length + 1))
{
cout << "i值不合法,請輸入1……" << L.length + 1 << "之間的整數";
return ERROR;
} //i值不合法,其中+1表示可以在表尾插入一個數據
for (int j = L.length - 1; j >= i - 1; j--) //將i及其后的值后移
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = x;
++L.length;
return OK;
}
//04刪除第i個元素,並在刪除結束后輸出刪除元素的值
Status SqListDelete(SqList &L, int i)
{
if (!L.elem)
{
cout << "表不存在!";
return ERROR; //表不存在
}
if ((i<1) || (i>L.length))
{
cout << "i值不合法,請輸入1……" << L.length << "之間的整數";
return ERROR;
} //i值不合法
ElemType x = L.elem[i - 1];
for (int j = i; j <= L.length; j++)
L.elem[j - 1] = L.elem[j]; //被刪除元素之后的元素前移
--L.length;
cout << "刪除第" << i << "個元素的值為:" << x << endl;
return OK;
}
//05查找指定元素e是否在線性表中存在,若存在返回此元素的位序,否則返回0
int LocateElem(SqList L, ElemType e)
{
if (!L.elem)
{
cout << "表不存在!";
return ERROR; //表不存在
}
for (int i = 0; i < L.length; i++)
if (L.elem[i] == e) return i + 1;//是一條語句;不能寫成if(L.elem[i]==e)return i+1;else return 0; LA1 2 3 LB1 2 3,后面2去和LA第一個1比較不等,else 0,意思2不在LA,就錯了.return 0需在for循環外
return 0;
}
//06查找指定位置元素的值並輸出
Status Getelem(SqList L, int i, ElemType &e)
{
if ((i<1) || (i>L.length))
{
cout << "i值不合法,請輸入1……" << L.length << "之間的整數";
return ERROR;
}
e = L.elem[i - 1];
return OK;
}
//07遍歷線性表中所有元素(數組下標遍歷法)
Status TraverseSqList(SqList L)
{
if (!L.elem)
{
cout << "表不存在!";
return ERROR; //表不存在
}
for (int i = 0; i < L.length; i++)
cout << L.elem[i] << " ";
cout << endl;
return OK;
}
數組指針遍歷法,僅供參考
LNode *pa=L.elem;//數組指針,不要用L.elem++,這樣L就不是原來的順序表了,因為L.elem值++后變了。
while(pa<pa+L.length)
{
cout<<*pa<<" ";
pa++;//指向下一個數據元素
}
//08 合並兩個順序表,將LB合並到LA中,學完要習,后面排序要用,還是要理順邏輯,寫出代碼。
Status SqList_Merge(SqList &LA, SqList LB)//LA是一個結構體變量,里面的長度域變,則LA變,故加&。
{
int m, n;//m-->LA.lenght;n--->LB.lenght
ElemType e;
m = LA.length;
n = LB.length;
for (int i = 1; i <= n; i++)
{
Getelem(LB, i, e);
if (!LocateElem(LA, e))
SqListInsert(LA, ++m, e);//m是站在數據結構的角度(下標1開始)去看,新元素應插入LA的m+1的位置。
}
return OK;
}