名人說(shuō):一花獨(dú)放不是春,百花齊放花滿園。——《增廣賢文》
作者:Code_流蘇(CSDN)(一個(gè)喜歡古詩(shī)詞和編程的Coder??)以下代碼個(gè)人分享出來(lái),僅供學(xué)習(xí)交流,且僅在CSDN平臺(tái)發(fā)布,未經(jīng)授權(quán)禁止二次轉(zhuǎn)發(fā)。
〇、線性表是什么?
1、定義
線性表是具有相同數(shù)據(jù)類型的n(n>=0)個(gè)數(shù)據(jù)元素的有限序列,其中n為表長(zhǎng),當(dāng)n=0時(shí)線性表是一個(gè)空表。
L=(a1,a2,a3…,an) a1為表頭元素,an為表尾元素,除第一個(gè)元素外,每個(gè)元素有且僅有一個(gè)直接前驅(qū),除最后一個(gè)元素,每個(gè)元素有且僅有一個(gè)直接后繼。
2、特點(diǎn)
- ①同類型
- ②有限
- ③有序
3、基本操作
那么該怎么用代碼實(shí)現(xiàn)基本操作呢?請(qǐng)往下看(以順序表為例)
一、代碼實(shí)現(xiàn)
#include <iostream>
using namespace std;
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
// 初始化線性表
void InitList(SqList &L) {
L.length = 0;
}
// 銷毀線性表
void DestroyList(SqList &L) {
L.length = 0;
}
// 在第i個(gè)位置插入元素e
bool ListInsert(SqList &L, int i, ElemType e) {
if (i < 1 || i > L.length + 1) return false;
if (L.length >= MaxSize) return false;
for (int j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1];
L.data[i - 1] = e;
L.length++;
return true;
}
// 刪除第i個(gè)位置的元素,并用e返回其值
bool ListDelete(SqList &L, int i, ElemType &e) {
if (i < 1 || i > L.length) return false;
e = L.data[i - 1];
for (int j = i; j < L.length; j++)
L.data[j - 1] = L.data[j];
L.length--;
return true;
}
// 按值查找,返回元素e的位序
int LocateElem(SqList L, ElemType e) {
for (int i = 0; i < L.length; i++)
if (L.data[i] == e) return i + 1;
return 0;
}
// 按位查找,返回第i個(gè)位置的元素值
bool GetElem(SqList L, int i, ElemType &e) {
if (i < 1 || i > L.length) return false;
e = L.data[i - 1];
return true;
}
// 返回線性表的長(zhǎng)度
int Length(SqList L) {
return L.length;
}
// 輸出線性表
void PrintList(SqList L) {
for (int i = 0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
}
// 判斷線性表是否為空
bool Empty(SqList L) {
return L.length == 0;
}
int main() {
SqList L;
InitList(L);
ListInsert(L, 1, 3);
ListInsert(L, 2, 4);
ListInsert(L, 3, 5);
PrintList(L);
int e = -1;
ListDelete(L, 2, e);
cout << "刪除的元素為:" << e << endl;
PrintList(L);
cout << "線性表長(zhǎng)度為:" << Length(L) << endl;
cout << "元素4的位置為:" << LocateElem(L,4) << endl;
}
十萬(wàn)個(gè)為什么:代碼中為什么要傳入?yún)?shù)的引用“&”?
因?yàn)橄胍獙?對(duì)參數(shù)的修改結(jié)果 “帶回來(lái)”
二、思路闡明
順序表是一種線性表的存儲(chǔ)結(jié)構(gòu)。順序表使用一段連續(xù)的存儲(chǔ)單元來(lái)存儲(chǔ)數(shù)據(jù),每個(gè)數(shù)據(jù)元素占用一個(gè)存儲(chǔ)單元。
在實(shí)現(xiàn)上述代碼的過(guò)程中,首先使用了一個(gè)結(jié)構(gòu)體來(lái)定義順序表,其中又用了一個(gè)數(shù)組data
來(lái)存儲(chǔ)數(shù)據(jù)元素,一個(gè)整型變量length
用來(lái)記錄線性表的長(zhǎng)度。
之后實(shí)現(xiàn)了多種對(duì)順序表的操作,包括初始化、銷毀、插入、刪除、按值查找、按位查找、求長(zhǎng)度、輸出和判空。
- InitList(&L)函數(shù):初始化線性表,將長(zhǎng)度設(shè)為0。
- DestroyList(&L)函數(shù):銷毀線性表,將長(zhǎng)度設(shè)為0。
- ListInsert(&L,i,e)函數(shù):在第i個(gè)位置插入元素e。首先判斷插入位置是否合法,然后將第i個(gè)位置及之后的元素后移一位,騰出空間插入新元素,最后將線性表長(zhǎng)度加1。
- ListDelete(&L,i,&e)函數(shù):刪除第i個(gè)位置的元素,并用e返回其值。首先判斷刪除位置是否合法,然后將被刪除元素的值賦給e,再將第i個(gè)位置之后的元素前移一位,最后將線性表長(zhǎng)度減1。
- LocateElem(L,e)函數(shù):按值查找,返回元素e的位序。遍歷線性表,找到第一個(gè)值等于e的元素并返回其位序。
- GetElem(L,i)函數(shù):按位查找,返回第i個(gè)位置的元素值。首先判斷查找位置是否合法,然后返回第i個(gè)位置的元素值。
- Length(L)函數(shù):返回線性表的長(zhǎng)度。
- PrintList(L)函數(shù):輸出線性表。
- Empty(L)函數(shù):判斷線性表是否為空。
最終按照順序表的操作順序,在main函數(shù)中進(jìn)行調(diào)用測(cè)試即可,具體測(cè)試見(jiàn)下方樣例測(cè)試,以上就是這段代碼的簡(jiǎn)要實(shí)現(xiàn)思路。
三、樣例測(cè)試
首先在1、2、3位置插入3、4、5的值,長(zhǎng)度為3,之后刪除值為4的元素,接著計(jì)算線性表的長(zhǎng)度,由一開(kāi)始的3變?yōu)榱?,也表明了刪除成功,在查找元素4的位置時(shí),由于元素4已經(jīng)被刪除了,所以在查找函數(shù)中返回了0。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-520035.html
3 4 5
刪除的元素為:4
3 5
線性表長(zhǎng)度為:2
元素4的位置為:0
--------------------------------
Process exited after 0.06322 seconds with return value 0
請(qǐng)按任意鍵繼續(xù). . .
? 部分內(nèi)容參考:王道數(shù)據(jù)結(jié)構(gòu)(B站/MOOC 咸魚(yú)學(xué)長(zhǎng)主講)
Code_流蘇(CSDN)(一個(gè)喜歡古詩(shī)詞和編程的Coder??)
如果對(duì)大家有幫助的話,希望大家能多多點(diǎn)贊+關(guān)注!這樣我動(dòng)力會(huì)更足哦! ?( ′???` )比心文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-520035.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu) 線性表的定義和基本操作(以順序表為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!