目錄
1.初始化
2.插入
3.刪除
4.查找
5.修改
6.長度
7.遍歷
8.完整代碼
🌈嗨!我是Filotimo__🌈。很高興與大家相識,希望我的博客能對你有所幫助。
💡本文由Filotimo__??原創,首發于CSDN📚。
📣如需轉載,請事先與我聯系以獲得授權??。
🎁歡迎大家給我點贊👍、收藏??,并在留言區📝與我互動,這些都是我前進的動力!
🌟我的格言:森林草木都有自己認為對的角度🌟。
在C語言中,線性表的順序存儲結構可以使用數組來實現。順序表是一種將元素按照順序存儲在連續的存儲空間中的線性結構。
順序表可以使用結構體來定義,例如:
#define MAXSIZE 100 // 線性表的最大長度typedef struct {int data[MAXSIZE]; // 存儲線性表元素的數組int length; // 當前線性表長度
} List;
以下是順序表的基本運算:
1.初始化
初始化一個空的順序表:
void initList(List *L) {L->length = 0;
}
L:指向順序表的指針。
將順序表的長度length賦值為0,相當于清空了順序表,使得順序表L中不再有任何元素。
2.插入
在某個位置插入一個元素,使得該位置原來的元素和之后的元素往后移動:
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;
}
函數的目的是將一個元素elem插入到順序表L的第i個位置。
i:要插入的位置
elem:要插入的元素的值
代碼的邏輯:
(1)判斷要插入的位置i是否越界,即是否小于1或大于線性表的長度加1。如果越界則返回0,表示失敗。
(2)判斷順序表L是否已滿,即順序表的長度是否達到了最大容量MAXSIZE。如果已滿則返回0,表示失敗。
(3)通過一個循環,將從位置i開始的元素都向后移動一位,為要插入的元素留出空位。
(4)將要插入的元素elem賦值給位置i-1的元素。
(5)增加順序表的長度。
(6)返回1,表示插入成功。
3.刪除
刪除某個位置的元素,使得該位置后面的元素往前移動:
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:要刪除的元素的位置
代碼的邏輯:
(1) 判斷要刪除的位置i是否越界,即是否小于1或大于順序表的長度。如果越界則返回0,表示失敗。
(2)通過一個循環,將從位置i+1開始的元素都向前移動一位,覆蓋了要被刪除的元素。
(3)減少順序表的長度。
(4)返回1,表示刪除成功。
4.查找
根據值或位置查找一個元素:
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; // 沒找到
}
elem:要查找的元素的值
代碼的邏輯:
(1)通過一個循環,遍歷順序表L中的每個元素。
(2)在循環中,判斷當前元素是否等于要查找的元素elem。如果相等,則返回當前元素的位置(即i+1)。
(3)如果循環結束還沒有找到相等的元素,則返回0,表示沒有找到。
5.修改
根據位置修改某個元素的值:
int setElem(List *L, int i, int elem) {if (i < 1 || i > L->length) {return 0; // 越界}L->data[i-1] = elem;return 1;
}
?i:要設置元素的位置
-elem:要設置的新值
代碼的邏輯:
(1)判斷要設置的位置i是否越界,即是否小于1或大于線性表的長度。如果越界則返回0,表示失敗。
(2)將線性表L的第i個位置的元素值設置為elem。
(3)返回1,表示設置成功。
6.長度
返回順序表的長度:
int listLength(List *L) {return L->length;
}
直接返回順序表L的長度L->length。
7.遍歷
依次訪問順序表中的每個元素:
void traverseList(List *L) {int i;for (i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}
代碼的邏輯:
(1)通過一個循環,遍歷順序表L中的每個元素。
(2)在循環中,使用printf函數依次將每個元素的值輸出到屏幕上,并在元素之間添加一個空格。
(3)在循環結束后,輸出一個換行符,以便下一行輸出。
8.完整代碼
這里順序表中的元素均設為 int 類型:
#include <stdio.h>#define MAXSIZE 100 // 線性表的最大長度typedef struct {int data[MAXSIZE]; // 存儲線性表元素的數組int length; // 當前線性表長度
} List;// 初始化線性表
void initList(List *L) {L->length = 0;
}// 在第 i 個位置插入元素 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 個元素
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;
}// 查找第一個等于 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; // 沒找到
}// 返回第 i 個元素的值
int getElem(List *L, int i) {if (i < 1 || i > L->length) {return 0; // 越界}return L->data[i-1];
}// 修改第 i 個元素的值為 elem
int setElem(List *L, int i, int elem) {if (i < 1 || i > L->length) {return 0; // 越界}L->data[i-1] = elem;return 1;
}// 返回線性表的長度
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 3listDelete(&L, 2);printf("刪除第 2 個元素后的線性表:");traverseList(&L); // 打印:1 3int elem = getElem(&L, 2);printf("第 2 個元素的值為%d\n", elem); // 打印:第 2 個元素的值為3setElem(&L, 1, 4);printf("修改第 1 個元素的值為 4 后的線性表:");traverseList(&L); // 打印:4 3printf("線性表的長度為 %d\n", listLength(&L)); // 打印:線性表的長度為 2int pos = locateElem(&L, 3);if (pos) {printf("元素 3 的下標為 %d\n", pos); // 打印:元素 3 的下標為 2} else {printf("元素 3 沒有找到\n");}return 0;
}
輸出結果如下: