<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在學習連結串列之前先掌握順序表
什麼是順序表?
順序表是用一段實體地址連續的儲存單元依次儲存資料元素的線性結構一般情況下采用陣列儲存,在陣列上完成資料的增刪查改。
順序表一般可分為:
提示:由於靜態功能有限,這裡主要討論動態順序表
範例:
typedef int SeqDataType // 順序表的動態儲存 typedef struct SeqList { SeqDataType* a; // 指向動態開闢的陣列 size_t size ; // 有效資料個數 size_t capicity ; // 容量空間的大小 }SeqList;
這裡使用SeqDataType定義是由於我們不知道a是什麼型別的陣列,因此我們要靈活運用功能就要事先定義SeqDataType的型別(此例為int),以便後續結構型別改變時容易操作
// 基本增刪查改介面 // 順序表初始化 void SeqListInit(SeqList* psl, size_t capacity); // 順序表銷燬 void SeqListDestory(SeqList* psl); // 順序表列印 void SeqListPrint(SeqList* psl); // 檢查空間,如果滿了,進行增容 void CheckCapacity(SeqList* psl); // 順序表尾插 void SeqListPushBack(SeqList* psl, SLDataType x); // 順序表尾刪 void SeqListPopBack(SeqList* psl); // 順序表頭插 void SeqListPushFront(SeqList* psl, SLDataType x); // 順序表頭刪 void SeqListPopFront(SeqList* psl); // 順序表查詢 int SeqListFind(SeqList* psl, SLDataType x);
在實現具體專案功能之前,要事先做好準備,即初始化,將其置空,assert函數下文講解
程式碼如下(範例):
void SeqListInit(SeqList* pq)//初始化 { assert(pq);//斷言,判斷是否可以執行1/0 pq->a = NULL; pq->size = 0; pq->capacity = 0; }
銷燬是在結束之後需要進行的操作,因為這裡是動態,需要考慮空間釋放,以免造成空間洩露。(先提到銷燬是因為其與初始化為首位)
程式碼如下(範例):
void SeqListDestory(SeqList* pq) { assert(pq); free(pq->a); pq->a = NULL; pq->capacity = pq->size = 0; }
動態進行就是根據輸入的資料改變自身陣列的大小,故我們需要對溢位的情況進行正確的規避,至於為什麼會溢位,因為我們在初始化的時候將其空間為0,無論第一次輸入多少資料都會溢位。
void SeqCheckCapacity(SeqList* pq) { if (pq->size == pq->capacity)//滿了,需要增容 { int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2; //SeqDataType* newA = malloc(sizeof(SeqDataType) * newcapacity); SeqDataType* newA =realloc(pq->a,sizeof(SeqDataType)* newcapacity);//或者直接擴容 if (newA == NULL) { printf("realloc failn"); exit(-1); } pq->a = newA; pq->capacity = newcapacity; } }
習慣上在擴容時我們習慣將其放大二倍的操作,由於realloc擴容分為兩種情況(這裡暫時不討論),故如果擴容失敗我們需要截止,並列印錯誤。
先上程式碼:
void SeqListPushBack(SeqList* pq, SeqDataType x) { assert(pq); SeqCheckCapacity(pq); pq->a[pq->size] = x; pq->size++; }
顧名思義就是在尾部增添內容,size正對應有效陣列下標的下一位,對該位置進行賦值,最後有效陣列size應+1,由於尾增之前我們不知道其capacity是否等於size
故我們需要進行檢查seqCheckCapacity,如果相等,則需要擴容。
void SeqListPrint(SeqList* pq) { assert(pq); for (int i = 0; i < pq->size; ++i) { printf("%d ", pq->a[i]); } printf("n"); }
這裡具體就沒什麼了,只是為了保證程式功能能夠具體完整實現
其他功能看下面程式碼
#define _CRT_SECURE_NO_WARNINGS 1 #include"SeqList.h" #include<assert.h> void SeqListInit(SeqList* pq)//初始化 { assert(pq);//斷言,判斷是否可以執行1/0 pq->a = NULL; pq->size = 0; pq->capacity = 0; } void SeqListDestory(SeqList* pq) { assert(pq); free(pq->a); pq->a = NULL; pq->capacity = pq->size = 0; } void SeqCheckCapacity(SeqList* pq) { if (pq->size == pq->capacity)//滿了,需要增容 { int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2; //SeqDataType* newA = malloc(sizeof(SeqDataType) * newcapacity); SeqDataType* newA =realloc(pq->a,sizeof(SeqDataType)* newcapacity);//或者直接擴容 if (newA == NULL) { printf("realloc failn"); exit(-1); } pq->a = newA; pq->capacity = newcapacity; } } void SeqListPushBack(SeqList* pq, SeqDataType x) { assert(pq); SeqCheckCapacity(pq); pq->a[pq->size] = x; pq->size++; } void SeqListPrint(SeqList* pq) { assert(pq); for (int i = 0; i < pq->size; ++i) { printf("%d ", pq->a[i]); } printf("n"); } void SeqListPushFront(SeqList* pq, SeqDataType x) { assert(pq); SeqCheckCapacity(pq); int end = pq->size - 1; while (end >= 0) { pq->a[end + 1] = pq->a[end]; end--; } pq->a[0] = x; pq->size++; } void SeqListPopBack(SeqList* pq) { assert(pq); assert(pq->size > 0); --pq->size; } void SeqListPopFront(SeqList* pq);//尾刪暫時不實現
test.c主函數內碼錶
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include"SeqList.h" void TestSeqList1() { SeqList s; SeqListInit(&s);//ʼ SeqListPushBack(&s, 1); SeqListPushBack(&s, 2); SeqListPushBack(&s, 3); SeqListPushBack(&s, 4); SeqListPushBack(&s, 5); SeqListPushFront(&s, 0); SeqListPushFront(&s, 0); SeqListPushFront(&s, 0); SeqListPushFront(&s, 0); SeqListPrint(&s); SeqListPopBack(&s); SeqListPrint(&s); SeqListPopBack(&s); SeqListPrint(&s); SeqListDestory(&s);// } int main() { TestSeqList1(); return 0; }
順序表型別實現通訊錄後期會更,此目的是為了捋清楚如何構造各項結構與結構之間的關係->資料結構,尾刪,首刪,首增功能都較為容易,可以看上部分SeqList.c。此外,assert函數為斷言,目的是防止出現錯誤卻找不到並且執行的情況,其參照的標頭檔案為:assert.h。
到此這篇關於C語言資料結構順序表的進階講解的文章就介紹到這了,更多相關C語言 順序表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45