C語言線性表中順序表超詳細(xì)理解
一、本章重點
1.線性表和順序表的概念
2.動態(tài)和靜態(tài)順序表接口實現(xiàn)
3.在線0j訓(xùn)練
二、線性表
滿足下列條件的即為線性表:
- 線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。
- 線性表在邏輯上是線性結(jié)構(gòu),但是在物理結(jié)構(gòu)上并不一定是連續(xù)的。(這里的物理結(jié)構(gòu)一般指物理地址空間)。
三、順序表
滿足下列條件的即為順序表:
- 是線性表
- 物理結(jié)構(gòu)上是連續(xù)的
順序表一般可以分為:
- 靜態(tài)順序表:使用定長數(shù)組存儲。
- 動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。
四、靜態(tài)順序表接口實現(xiàn)
4.1順序表初始化
void SeqListInint(SeqList* s)
{
assert(s);
memset(s->a, 0, sizeof(SeqListDataType) * MAXSIZE);
s->size = 0;
}還有一種簡單初始化的方式:
在創(chuàng)建順序表s的時候直接賦值0,即SeqList s = { 0 };
4.2順序表打印
void SeqListPrint(SeqList* s)
{
int i = 0;
for (i = 0; i < s->size; i++)
{
printf("%d ", s->a[i]);
}
printf("\n");
}傳順序表的地址,使用for循環(huán)語句,逐步打印數(shù)組元素。
4.3順序表尾插
void SeqListPushBack(SeqList* s, int x)
{
assert(s);
if (s->size == MAXSIZE)
{
printf("當(dāng)前空間已滿,無法繼續(xù)添加\n");
exit(1);
}
s->a[s->size] = x;
s->size++;
}先檢查s是否位空,如果為空則報錯,再檢查是否滿了,如果滿了,則提示已滿并結(jié)束程序。
4.4順序表尾刪
void SeqListPopBack(SeqList* s)
{
assert(s);
if (s->size == 0)
{
printf("當(dāng)前順序表為空,無法刪除\n");
exit(1);
}
s->size--;
}直接s->size--即可,不需要把最后的元素置為0.
4.5順序表頭插
void SeqListPushFront(SeqList* s, int x)
{
if (s->size == MAXSIZE)
{
printf("空間已滿,無法繼續(xù)添加\n");
exit(1);
}
if (s->size == 0)
{
s->a[s->size] = x;
s->size++;
return;
}
else
{
int j = 0;
for (j = s->size - 1; j >= 0; j--)
{
s->a[j + 1] = s->a[j];
}
s->a[0] = x;
s->size++;
}
}先將元素往后移動,移動完之后再放入要插入的元素。
4.6順序表頭刪
void SeqListPopFront(SeqList* s)
{
if (s->size == 0)
{
printf("當(dāng)前順序表為空,無法刪除\n");
exit(1);
}
int j = 0;
for (j = 1; j <s->size; j++)
{
s->a[j - 1] = s->a[j];
}
s->size--;
}使用移動元素的方式,覆蓋前面的內(nèi)容,達(dá)到刪除的目的。
4.7順序表任意位置插入
void SeqListInsert(SeqList* s, int pos, int x)
{
if (s->size == MAXSIZE)
{
printf("當(dāng)前空間已滿,無法繼續(xù)添加\n");
exit(1);
}
if (pos < 0||pos>s->size)
{
printf("插入位置有誤,無法插入\n");
exit(1);
}
if (pos == s->size)
{
s->a[s->size] = x;
s->size++;
return;
}
for (int j = s->size - 1; j >= pos; j--)
{
s->a[j + 1] = s->a[j];
}
s->a[pos] = x;
s->size++;
}找到元素位置,移動元素,再將要插入的元素放入。
4.8順序表任意位置刪除
void SeqListErase(SeqList* s, int pos)
{
assert(s);
if (s->size == 0)
{
printf("順序表為空,刪除失敗\n");
exit(1);
}
if (pos >= s->size || pos < 0)
{
printf("刪除位置不存在\n");
exit(1);
}
int j = 0;
for (j = pos; j < s->size-1; j++)
{
s->a[j] = s->a[j + 1];
}
s->size--;
}找到要刪除的位置,通過移動覆蓋要刪除的元素。
五、動態(tài)順序表接口實現(xiàn)
5.1順序表的初始化
void SeqListInint(SeqList* s)
{
assert(s);
s->a = (DataType*)malloc(10 * sizeof(DataType));
s->size = 0;
s->capacity = 10;
}將元素個數(shù)size置為0
開辟a的空間
初始容量設(shè)置為10
5.2順序表打印
void SeqListPrint(SeqList* s)
{
assert(s);
int i = 0;
for (i = 0; i < s->size; i++)
{
printf("%d ", s->a[i]);
}
printf("\n");
}5.3順序表尾插
void SeqListPushBack(SeqList* s, DataType x)
{
assert(s);
SeqListCheckCapacity(s);
s->a[s->size] = x;
s->size++;
}5.4順序表尾刪
void SeqListPopBack(SeqList* s)
{
assert(s);
if (s->size == 0)
{
printf("當(dāng)前順序表為空,刪除失敗\n");
exit(1);
}
s->size--;
}5.5順序表頭插
void SeqListPushFront(SeqList* s, DataType x)
{
assert(s);
SeqListCheckCapacity(s);
if (s->size == 0)
{
s->a[0] = x;
s->size++;
}
else
{
int end = s->size - 1;
while (end >= 0)
{
s->a[end + 1] = s->a[end];
end--;
}
s->a[0] = x;
s->size++;
}
}5.6順序表頭刪
void SeqListPopFront(SeqList* s)
{
assert(s);
if (s->size == 0)
{
printf("當(dāng)前順序表為空,無法刪除\n");
exit(1);
}
if (s->size == 1)
{
s->size--;
return;
}
else
{
int i = 0;
for (i = 0; i <=s->size-2 ; i++)
{
s->a[i] = s->a[i + 1];
}
s->size--;
}
}5.7順序表任意位置插入
void SeqListInsert(SeqList* s, int pos, DataType x)
{
assert(s);
SeqListCheckCapacity(s);
if (pos<0 || pos>s->size)
{
printf("插入位置不存在\n");
exit(1);
}
else if(pos==s->size)
{
s->a[s->size] = x;
s->size++;
}
else
{
int i = 0;
for (i = s->size - 1; i >= pos; i--)
{
s->a[i + 1] = s->a[i];
}
s->a[pos] = x;
s->size++;
}
}5.8順序表任意位置刪除
void SeqListErase(SeqList* s, int pos)
{
assert(s);
if (s->size == 0)
{
printf("當(dāng)前順序表為空,刪除失敗\n");
exit(1);
}
if (pos<0||pos>s->size-1)
{
printf("要刪除的位置不存在\n");
exit(1);
}
else
{
int i = 0;
for (i = pos; i <= s->size - 2; i++)
{
s->a[i] = s->a[i + 1];
}
s->size--;
}
}六、在線0j練習(xí)
一、移除元素(力扣)
給你一個數(shù)組 nums 和一個值 val,你需要 原地 移除所有數(shù)值等于 val 的元素,并返回移除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數(shù)組。
元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。
例一:
輸入:nums = [0,1,2,2,3,0,4,2], val = 2 輸出:5, nums = [0,1,4,0,3] 解釋:函數(shù)應(yīng)該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。注意這五個元素可為任意順序。你不需要考慮數(shù)組中超出新長度后面的元素。
思路:用兩個指針,一個用來遍歷數(shù)組,另一個指向你要存數(shù)據(jù)的地方。
如果可以申請額外的空間的話,一般來說,我們可以這樣做:申請一個新的數(shù)組空間,用來存放非val值的數(shù)據(jù)。其實這個新的空間我們可以直接把nums數(shù)組原空間直接當(dāng)做新空間使用,我們只需遍歷一遍nums數(shù)組即可。
int removeElement(int* nums, int numsSize, int val)
{
int i = 0;
int j = 0;
for(i=0;i<numsSize;i++)
{
if(nums[i]!=val)
{
nums[j]=nums[i];
j++;
}
}
return j;
}二、合并兩個有序數(shù)組(力扣)
給你兩個按 非遞減順序 排列的整數(shù)數(shù)組 nums1 和 nums2,另有兩個整數(shù) m 和 n ,分別表示 nums1 和 nums2 中的元素數(shù)目。
請你 合并 nums2 到 nums1 中,使合并后的數(shù)組同樣按 非遞減順序 排列。
注意:最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲在數(shù)組 nums1 中。為了應(yīng)對這種情況,nums1 的初始長度為 m + n,其中前 m 個元素表示應(yīng)合并的元素,后 n 個元素為 0 ,應(yīng)忽略。nums2 的長度為 n
例一
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合并 [1,2,3] 和 [2,5,6] 。 合并結(jié)果是 [1,2,2,3,5,6] ,其中斜體加粗標(biāo)注的為 nums1 中的元素。
思路:從后往前放,nums1和nums2中較大的數(shù)。(參考一)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int end1 = m-1;
int end2 = n-1;
int k = m + n -1;
while(end1>=0 && end2>=0)
{
if(nums1[end1] >= nums2[end2])
{
nums1[k]=nums1[end1];
k--;
end1--;
}
else
{
nums1[k]=nums2[end2];
k--;
end2--;
}
}
while(end2>=0)
{
nums1[k]=nums2[end2];
k--;
end2--;
}
}到此這篇關(guān)于C語言線性表中順序表超詳細(xì)理解的文章就介紹到這了,更多相關(guān)C語言 順序表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual C++ 常用數(shù)據(jù)類型轉(zhuǎn)換方法詳解
本文純粹是總結(jié)一下有關(guān)類型轉(zhuǎn)換的貼子,需要的朋友可以參考下2017-06-06
windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境
這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法
這篇文章主要介紹了C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下2014-10-10
C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
C++ Primer Plus 第四章之C++ Primer Plus復(fù)合類型學(xué)習(xí)筆記
數(shù)組(array)是一種數(shù)據(jù)格式,能夠存儲多個同類型的值。每個值都存儲在一個獨立的數(shù)組元素中,計算機(jī)在內(nèi)存中依次存儲數(shù)組的各個元素,今天給大家重點介紹C++ Primer Plus復(fù)合類型的實例詳解,感興趣的朋友一起看看吧2021-07-07

