目錄
1.初始化
2.插入
3.刪除
4.查找
5.修改
6.長(zhǎng)度
7.遍歷
8.完整代碼
??嗨!我是Filotimo__??。很高興與大家相識(shí),希望我的博客能對(duì)你有所幫助。
??本文由Filotimo__??原創(chuàng),首發(fā)于CSDN??。
??如需轉(zhuǎn)載,請(qǐng)事先與我聯(lián)系以獲得授權(quán)??。
??歡迎大家給我點(diǎn)贊??、收藏??,并在留言區(qū)??與我互動(dòng),這些都是我前進(jìn)的動(dòng)力!
??我的格言:森林草木都有自己認(rèn)為對(duì)的角度??。
在C語(yǔ)言中,線性表的順序存儲(chǔ)結(jié)構(gòu)可以使用數(shù)組來(lái)實(shí)現(xiàn)。順序表是一種將元素按照順序存儲(chǔ)在連續(xù)的存儲(chǔ)空間中的線性結(jié)構(gòu)。
順序表可以使用結(jié)構(gòu)體來(lái)定義,例如:
#define MAXSIZE 100 // 線性表的最大長(zhǎng)度
typedef struct {
int data[MAXSIZE]; // 存儲(chǔ)線性表元素的數(shù)組
int length; // 當(dāng)前線性表長(zhǎng)度
} List;
以下是順序表的基本運(yùn)算:
1.初始化
初始化一個(gè)空的順序表:
void initList(List *L) {
L->length = 0;
}
L:指向順序表的指針。
將順序表的長(zhǎng)度length賦值為0,相當(dāng)于清空了順序表,使得順序表L中不再有任何元素。
2.插入
在某個(gè)位置插入一個(gè)元素,使得該位置原來(lái)的元素和之后的元素往后移動(dòng):
int listInsert(List *L, int i, int elem) {
int j;
if (i < 1 || i > L->length + 1) {
return 0; // 越界
}
if (L->length >= MAXSIZE) {
return 0; // 線性表已滿
}
for (j = L->length; j >= i; j--) {
L->data[j] = L->data[j-1];
}
L->data[i-1] = elem;
L->length++;
return 1;
}
函數(shù)的目的是將一個(gè)元素elem插入到順序表L的第i個(gè)位置。
i:要插入的位置
elem:要插入的元素的值
代碼的邏輯:
(1)判斷要插入的位置i是否越界,即是否小于1或大于線性表的長(zhǎng)度加1。如果越界則返回0,表示失敗。
(2)判斷順序表L是否已滿,即順序表的長(zhǎng)度是否達(dá)到了最大容量MAXSIZE。如果已滿則返回0,表示失敗。
(3)通過(guò)一個(gè)循環(huán),將從位置i開(kāi)始的元素都向后移動(dòng)一位,為要插入的元素留出空位。
(4)將要插入的元素elem賦值給位置i-1的元素。
(5)增加順序表的長(zhǎng)度。
(6)返回1,表示插入成功。
3.刪除
刪除某個(gè)位置的元素,使得該位置后面的元素往前移動(dòng):
int listDelete(List *L, int i) {
int j;
if (i < 1 || i > L->length) {
return 0; // 越界
}
for (j = i; j < L->length; j++) {
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
i:要?jiǎng)h除的元素的位置
代碼的邏輯:
(1) 判斷要?jiǎng)h除的位置i是否越界,即是否小于1或大于順序表的長(zhǎng)度。如果越界則返回0,表示失敗。
(2)通過(guò)一個(gè)循環(huán),將從位置i+1開(kāi)始的元素都向前移動(dòng)一位,覆蓋了要被刪除的元素。
(3)減少順序表的長(zhǎng)度。
(4)返回1,表示刪除成功。
4.查找
根據(jù)值或位置查找一個(gè)元素:
int locateElem(List *L, int elem) {
int i;
for (i = 0; i < L->length; i++) {
if (L->data[i] == elem) {
return i+1;
}
}
return 0; // 沒(méi)找到
}
elem:要查找的元素的值
代碼的邏輯:
(1)通過(guò)一個(gè)循環(huán),遍歷順序表L中的每個(gè)元素。
(2)在循環(huán)中,判斷當(dāng)前元素是否等于要查找的元素elem。如果相等,則返回當(dāng)前元素的位置(即i+1)。
(3)如果循環(huán)結(jié)束還沒(méi)有找到相等的元素,則返回0,表示沒(méi)有找到。
5.修改
根據(jù)位置修改某個(gè)元素的值:
int setElem(List *L, int i, int elem) {
if (i < 1 || i > L->length) {
return 0; // 越界
}
L->data[i-1] = elem;
return 1;
}
?i:要設(shè)置元素的位置
-elem:要設(shè)置的新值
代碼的邏輯:
(1)判斷要設(shè)置的位置i是否越界,即是否小于1或大于線性表的長(zhǎng)度。如果越界則返回0,表示失敗。
(2)將線性表L的第i個(gè)位置的元素值設(shè)置為elem。
(3)返回1,表示設(shè)置成功。
6.長(zhǎng)度
返回順序表的長(zhǎng)度:
int listLength(List *L) {
return L->length;
}
直接返回順序表L的長(zhǎng)度L->length。
7.遍歷
依次訪問(wèn)順序表中的每個(gè)元素:
void traverseList(List *L) {
int i;
for (i = 0; i < L->length; i++) {
printf("%d ", L->data[i]);
}
printf("\n");
}
代碼的邏輯:
(1)通過(guò)一個(gè)循環(huán),遍歷順序表L中的每個(gè)元素。
(2)在循環(huán)中,使用printf函數(shù)依次將每個(gè)元素的值輸出到屏幕上,并在元素之間添加一個(gè)空格。
(3)在循環(huán)結(jié)束后,輸出一個(gè)換行符,以便下一行輸出。
8.完整代碼
這里順序表中的元素均設(shè)為 int 類型:
#include <stdio.h>
#define MAXSIZE 100 // 線性表的最大長(zhǎng)度
typedef struct {
int data[MAXSIZE]; // 存儲(chǔ)線性表元素的數(shù)組
int length; // 當(dāng)前線性表長(zhǎng)度
} List;
// 初始化線性表
void initList(List *L) {
L->length = 0;
}
// 在第 i 個(gè)位置插入元素 elem
int listInsert(List *L, int i, int elem) {
int j;
if (i < 1 || i > L->length + 1) {
return 0; // 越界
}
if (L->length >= MAXSIZE) {
return 0; // 線性表已滿
}
for (j = L->length; j >= i; j--) {
L->data[j] = L->data[j-1];
}
L->data[i-1] = elem;
L->length++;
return 1;
}
// 刪除第 i 個(gè)元素
int listDelete(List *L, int i) {
int j;
if (i < 1 || i > L->length) {
return 0; // 越界
}
for (j = i; j < L->length; j++) {
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
// 查找第一個(gè)等于 elem 的元素
int locateElem(List *L, int elem) {
int i;
for (i = 0; i < L->length; i++) {
if (L->data[i] == elem) {
return i+1;
}
}
return 0; // 沒(méi)找到
}
// 返回第 i 個(gè)元素的值
int getElem(List *L, int i) {
if (i < 1 || i > L->length) {
return 0; // 越界
}
return L->data[i-1];
}
// 修改第 i 個(gè)元素的值為 elem
int setElem(List *L, int i, int elem) {
if (i < 1 || i > L->length) {
return 0; // 越界
}
L->data[i-1] = elem;
return 1;
}
// 返回線性表的長(zhǎng)度
int listLength(List *L) {
return L->length;
}
// 遍歷線性表
void traverseList(List *L) {
int i;
for (i = 0; i < L->length; i++) {
printf("%d ", L->data[i]);
}
printf("\n");
}
int main() {
List L;
initList(&L);
listInsert(&L, 1, 1);
listInsert(&L, 2, 2);
listInsert(&L, 3, 3);
printf("插入 1, 2, 3 后的線性表:");
traverseList(&L); // 打印:1 2 3
listDelete(&L, 2);
printf("刪除第 2 個(gè)元素后的線性表:");
traverseList(&L); // 打?。? 3
int elem = getElem(&L, 2);
printf("第 2 個(gè)元素的值為%d\n", elem); // 打印:第 2 個(gè)元素的值為3
setElem(&L, 1, 4);
printf("修改第 1 個(gè)元素的值為 4 后的線性表:");
traverseList(&L); // 打?。? 3
printf("線性表的長(zhǎng)度為 %d\n", listLength(&L)); // 打?。壕€性表的長(zhǎng)度為 2
int pos = locateElem(&L, 3);
if (pos) {
printf("元素 3 的下標(biāo)為 %d\n", pos); // 打印:元素 3 的下標(biāo)為 2
} else {
printf("元素 3 沒(méi)有找到\n");
}
return 0;
}
輸出結(jié)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-753135.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-753135.html
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】順序表的定義和運(yùn)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!