=========================================================================
相關(guān)代碼gitee自取:
C語言學(xué)習(xí)日記: 加油努力 (gitee.com)
?=========================================================================
接上期:
【數(shù)據(jù)結(jié)構(gòu)初階】一. 復(fù)雜度講解_高高的胖子的博客-CSDN博客
?=========================================================================
?? ? ? ? ? ? ? ? ? ? ?
1 . 線性表
? ? ? ? ? ? ? ?
線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。
線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),
常見的線性表:順序表、鏈表、棧、隊列、字符串...
順序表示例:
? ? ? ? ? ? ??
? ? ? ? ? ? ??
線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。
但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,
線性表在物理上存儲時,通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲。
鏈表示例:
? ? ? ? ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? ? ? ? ?
2 . 順序表
順序表概念及結(jié)構(gòu):
? ? ? ? ? ? ? ?
順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),
一般情況下采用數(shù)組存儲,
在數(shù)組上完成數(shù)據(jù)的增刪查改,
順序表一般可以分為 靜態(tài)順序表 和 動態(tài)順序表
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
靜態(tài)順序表:使用定長數(shù)組存儲元素
? ? ? ? ? ? ? ??
因為靜態(tài)順序表使用定長數(shù)組存儲元素,
對空間的運(yùn)用不夠靈活,可能造成空間浪費(fèi)或不夠的問題,
所以在實際情況下,靜態(tài)順序表并不常用(不夠?qū)嵱?/span>)示例:
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ??
動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲元素
? ? ? ? ? ? ?
靜態(tài)順序表只適用于確定知道需要存多少數(shù)據(jù)的場景。
靜態(tài)順序表的定長數(shù)組導(dǎo)致N定大了,空間開多了浪費(fèi),開少了不夠用。
所以現(xiàn)實中基本都是使用動態(tài)順序表,根據(jù)需要動態(tài)地分配空間大小
示例:
? ? ? ? ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? ? ? ? ?
3 .接口實現(xiàn)(實現(xiàn)動態(tài)順序表):
(詳細(xì)解釋在注釋,代碼分文件放最后)
? ? ? ? ? ? ? ??
數(shù)據(jù)結(jié)構(gòu)可以管理數(shù)據(jù),
通過 增刪改查 等操作就可以實現(xiàn)管理數(shù)據(jù)
? ? ? ? ? ? ??
現(xiàn)在有了動態(tài)順序表后,
就可以對其進(jìn)行增刪改查等操作來實現(xiàn)動態(tài)順序表
? ? ? ? ? ? ? ? ? ? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-714890.html
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??文章來源:http://www.zghlxwxcb.cn/news/detail-714890.html
? ? ? ? ? ? ? ? ? ? ??
SLInit函數(shù) -- 順序表初始化
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLDestroy函數(shù) -- 順序表銷毀
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLPrint函數(shù) -- 測試函數(shù)
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLPushBack函數(shù) -- 將值插入順序表尾部(尾插)
尾插函數(shù)SLPushBack測試:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
上面尾插需要考慮空間不夠進(jìn)行擴(kuò)容,
后面的頭插同樣也需要考慮,
所以可以在順序表實現(xiàn)文件中設(shè)置一個內(nèi)部函數(shù)SLCheckCapacity,
在需要的時候直接調(diào)用該函數(shù)進(jìn)行擴(kuò)容操作
↓↓↓↓↓
? ? ? ? ? ? ? ? ?
SLCheckCapacity內(nèi)部函數(shù) -- 進(jìn)行擴(kuò)容操作
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLPopBack函數(shù) -- 將值從順序表尾部刪除(尾刪)
尾刪函數(shù)SLPopBack測試:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLPushFront函數(shù) -- 將值插入順序表頭部(頭插)
頭插函數(shù)SLPushFront測試:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLPopFront函數(shù) -- 將值從順序表頭部刪除(頭刪)
頭刪函數(shù)SLPopFront測試:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLInsert函數(shù) -- 在指定位置(pos)插入想要的值(x)
指定添加函數(shù)SLInsert測試:
? ? ? ? ? ? ?
這里寫了指定位置插入SLInsert函數(shù)后,
可以想到其實 頭插 和 尾插 也是可以用 SLInsert函數(shù) 實現(xiàn)的,
所以可以在頭插和尾插函數(shù)中復(fù)用 SLInsert函數(shù) 來減少代碼量
↓↓↓↓↓
? ? ? ? ? ? ? ? ??
復(fù)用SLInsert函數(shù) -- 改寫頭插函數(shù)SLPushFront
? ? ? ? ? ? ? ? ? ? ?
復(fù)用SLInsert函數(shù) -- 改寫尾插函數(shù)SLPushBack
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
上面SLInsert函數(shù)中涉及了插入位置pos下標(biāo),
有時在增刪改查操作時,需要知道有效元素中某個元素的下標(biāo)再進(jìn)行操作,
所以我們可以定義一個函數(shù)SLFind來查找該元素的下標(biāo)
↓↓↓↓↓
? ? ? ? ? ? ? ? ?
SLFind函數(shù) -- 查找x這個值在順序表中的下標(biāo)是多少
查找函數(shù)SLFind測試:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLErase函數(shù) --?刪除指定位置(pos)的值
刪除指定位置函數(shù)SLErase測試:
? ? ? ? ? ? ? ? ? ?
完成指定刪除SLErase函數(shù)后,
頭刪 和 尾刪 函數(shù)中也可以進(jìn)行復(fù)用?SLErase函數(shù)?來減少代碼量
↓↓↓↓↓
? ? ? ? ? ? ? ? ??
復(fù)用SLErase函數(shù) -- 改寫頭刪函數(shù)SLPopFront
? ? ? ? ? ? ? ? ? ? ?
復(fù)用SLErase函數(shù) -- 改寫尾刪函數(shù)SLPopBack
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SLModify函數(shù) --?把某個位置(pos)的值修改為某值(x)
修改函數(shù)SLModify測試:
?? ? ? ? ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? ? ? ? ?
4 . 對應(yīng)代碼
SeqList.h -- 順序表頭文件
#pragma once 定義一個靜態(tài)順序表:使用定長數(shù)組存儲元素 因為靜態(tài)順序表使用定長數(shù)組存儲元素,對空間的運(yùn)用不夠靈活 所以在實際情況下,靜態(tài)順序表并不常用(不夠?qū)嵱茫?// //#define N 1000 //“表”的大小的值 //typedef int SLDataType; //定義順序表中存儲的類型,這里是int類型 // //struct SeqList //{ // SLDataType a[N]; //定義表的大小 // int size; //記錄表中存儲了多少個有效數(shù)據(jù) //}; //將需要的頭文件都包含在 SeqList.h 頭文件中 #include <stdio.h> #include <stdlib.h> #include <assert.h> //定義一個動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲元素 typedef int SLDataType; //定義順序表中存儲的類型,這里是int類型 typedef struct SeqList { //定義一個順序表類型的指針,指向動態(tài)開辟的數(shù)組 SLDataType* a; int size; //記錄表中存儲了多少個有效數(shù)據(jù) int capactity; //容量空間的大小 }SL; //數(shù)據(jù)結(jié)構(gòu) --> 管理數(shù)據(jù) --> 增刪查改 //順序表初始化 -- 頭文件中聲明 void SLInit(SL* ps); //順序表銷毀 -- 頭文件中聲明 //內(nèi)存是動態(tài)開辟地,不銷毀的話可能會導(dǎo)致內(nèi)存泄漏) void SLDestroy(SL* ps); //寫一個測試函數(shù)(聲明),方便檢查各步驟有沒有問題: void SLPrint(SL* ps); //尾插(聲明) -- 將值插入順序表尾部: void SLPushBack(SL* ps, SLDataType x); //尾刪(聲明) -- 將值從順序表尾部刪除: void SLPopBack(SL* ps); //頭插(聲明) -- 將值插入順序表頭部: void SLPushFront(SL* ps, SLDataType x); //頭刪(聲明) -- 將值從順序表頭部刪除: void SLPopFront(SL* ps); //在指定位置(pos)插入想要的值(x) void SLInsert(SL* ps, int pos, SLDataType x); //查找x這個值在順序表中的下標(biāo)是多少: int SLFind(SL* ps, SLDataType x); //返回找到的下標(biāo) //刪除指定位置(pos)的值: void SLErase(SL* ps, int pos); //把某個位置(pos)的值修改為某值(x) void SLModify(SL* ps, int pos, SLDataType x);
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
SeqList.c?-- 順序表實現(xiàn)文件
#define _CRT_SECURE_NO_WARNINGS 1 //包含我們寫的 SeqList.h 頭文件 #include "SeqList.h" //順序表初始化 -- 實現(xiàn) void SLInit(SL* ps) { //assert斷言,防止接收空指針: assert(ps); //初始化順序表類型指針 //初始化時要先開辟一些動態(tài)空間: //開辟的空間為順序表類型,大小為4個順序表類型的大小 ps->a = (SLDataType*)malloc(sizeof(SLDataType)*4); //順序表作為一個獨(dú)立的程序,之后可能會應(yīng)用于其他程序, //所以要對開辟的動態(tài)空間進(jìn)行檢查: if (ps->a == NULL) { //可能開辟的空間過大 或 前面開辟太多空間不夠再開辟 perror("malloc failed"); //打印錯誤 //讓程序以異常的形式結(jié)束程序 //和 return 不同,return后主函數(shù)還會繼續(xù)進(jìn)行 exit(-1); } //將順序表中的有效數(shù)據(jù)初始化為0: ps->size = 0; //將已動態(tài)開辟的容量空間初始化為4: ps->capactity = 4; } //順序表銷毀 -- 實現(xiàn) //內(nèi)存是動態(tài)開辟地,不銷毀的話可能會導(dǎo)致內(nèi)存泄漏) void SLDestroy(SL* ps) { //assert斷言,防止接收空指針: assert(ps); //釋放前面開辟的動態(tài)空間: free(ps->a); //將釋放的指針置為空指針: ps->a = NULL; //將已開辟的動態(tài)空間置為0,順序表有效數(shù)據(jù)也置為0 ps->capactity = ps->size = 0; } //寫一個測試函數(shù)(實現(xiàn)),方便檢查各步驟有沒有問題: void SLPrint(SL* ps) { //assert斷言,防止接收空指針: assert(ps); //打印動態(tài)順序表現(xiàn)有的有效數(shù)據(jù): for (int i = 0; i < ps->size; i++) { printf("%d ", ps->a[i]); } //打印完當(dāng)前動態(tài)順序表有效數(shù)據(jù)后進(jìn)行換行: printf("\n"); } //在順序表實現(xiàn)文件中設(shè)置一個內(nèi)部函數(shù)SLCheckCapacity, //在需要的時候直接調(diào)用該函數(shù)進(jìn)行擴(kuò)容操作 void SLCheckCapacity(SL* ps) { //assert斷言,防止接收空指針: assert(ps); //判斷開辟的空間是否已滿,滿了再開辟: if (ps->size == ps->capactity) //順序表有效個數(shù) 等于 已開辟容量空間 { //使用 realloc函數(shù) 進(jìn)行擴(kuò)容,每次擴(kuò)容2倍: SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capactity * 2 * (sizeof(SLDataType))); // realloc 是把空間擴(kuò)容到第二個參數(shù)的大小,而不是直接把空間擴(kuò)容第二個參數(shù)的大小 //同樣進(jìn)行檢驗: if (tmp == NULL) { //打印錯誤: perror("realloc failed"); //出現(xiàn)錯誤直接終止程序: exit(-1); } //realloc函數(shù),有兩種擴(kuò)容情況:一種是原地擴(kuò)容,另一種是異地擴(kuò)容 //原地擴(kuò)容:擴(kuò)容時看原空間后的內(nèi)容有沒有分配給別人,如果沒有則把原空間后面的空間標(biāo)記出來進(jìn)行擴(kuò)容,返回原空間的地址 //異地擴(kuò)容:如果擴(kuò)容時原空間后面的內(nèi)容已被分配,則另找一個足夠原空間擴(kuò)容后的空間進(jìn)行存放, // 原本的數(shù)據(jù)都搬到這個空間來,原空間會被釋放,返回這個新空間的地址。 //所以使用 realloc函數(shù) 擴(kuò)容后,不要對原空間指針進(jìn)行釋放, //如果realloc執(zhí)行后是原地擴(kuò)容返回原空間指針,擴(kuò)容后后對原空間指針釋放就會出問題 //把擴(kuò)容返回的指針賦給原指針: ps->a = tmp; //將已動態(tài)開辟的容量空間置為原來的2倍: ps->capactity *= 2; } } //尾插(實現(xiàn)) -- 將值插入順序表尾部: void SLPushBack(SL* ps, SLDataType x) { //assert斷言,防止接收空指針: assert(ps); 調(diào)用內(nèi)部函數(shù)進(jìn)行擴(kuò)容操作: //SLCheckCapacity(ps); 空間容量足夠后將要插入尾部的值插入: //ps->a[ps->size] = x; 因為下標(biāo)從0開始,所以size的值會等于現(xiàn)有元素下一位的下標(biāo) //ps->size++; //尾部插入元素后,更新順序表中有效數(shù)據(jù)個數(shù) //復(fù)用SLInsert函數(shù) -- 改寫尾插函數(shù)SLPushBack SLInsert(ps, ps->size, x); //在size位置插入就相當(dāng)于尾插 } //尾刪(實現(xiàn)) -- 將值從順序表尾部刪除: void SLPopBack(SL* ps) { //assert斷言,防止接收空指針: assert(ps); 檢查一下:如果有效數(shù)據(jù)size等于0,則不能繼續(xù)刪除了 防止越界,可能一直刪除到空間外了導(dǎo)致越界 // 檢查方法一:太“溫柔”,返回后不知道自己錯了 if (ps->size == 0) { return; //直接返回 即可 } // 檢查方法二:使用斷言,錯誤了會直接報錯并給出錯誤信息 //assert(ps->size > 0); //順序表中有效數(shù)據(jù)大于0才進(jìn)行下面的操作 直接有效數(shù)據(jù)size--即可 尾插是也是用size插入的,所以下次添加時直接就覆蓋了原來值 //ps->size--; 不能局部釋放,不能說不要末尾的值就把末尾的這個空間直接釋放掉 C++有個規(guī)定,malloc一次就要free一次,要free釋放的話只能整體釋放 順序表的物理內(nèi)存是連續(xù)的,釋放空間是不能“分期”的 //復(fù)用SLErase函數(shù) -- 改寫尾刪函數(shù)SLPopBack SLErase(ps, ps->size-1); //size-1 就是最末元素下標(biāo) } //頭插(實現(xiàn)) -- 將值插入順序表頭部: void SLPushFront(SL* ps, SLDataType x) { //assert斷言,防止接收空指針: assert(ps); 調(diào)用內(nèi)部函數(shù)進(jìn)行擴(kuò)容操作: //SLCheckCapacity(ps); 將現(xiàn)有有效數(shù)據(jù)往后移一位,讓出頭位置: //int end = ps->size - 1; size-1 有效個數(shù)-1,就相當(dāng)于當(dāng)前最后一個元素的下標(biāo) //while (end >= 0) // //使用while循環(huán)循環(huán)移動各個有效元素,一直移到下標(biāo)為0的元素 //{ // ps->a[end + 1] = ps->a[end]; //end下標(biāo)元素 移到 下一位上 // --end; //改變下標(biāo) //} 將要插入頭部的元素x插入頭部: //ps->a[0] = x; 有效個數(shù)加一: //ps->size++; Capacity在擴(kuò)容函數(shù)SLCheckCapacity中就修改好了 //復(fù)用SLInsert函數(shù) -- 改寫頭插函數(shù)SLPushFront SLInsert(ps, 0, x); //在0位置插入就相當(dāng)于頭插 } //頭刪(實現(xiàn)) -- 將值從順序表頭部刪除: void SLPopFront(SL* ps) { //assert斷言,防止接收空指針: assert(ps); 因為要將頭部的有效元素刪除, 所以直接把第一個有效元素后面的其他元素往前移一位就行了, 覆蓋掉第一個元素 先進(jìn)行斷言檢查,防止沒有元素還進(jìn)行刪除: //assert(ps->size > 0); //int begin = 1; //從下標(biāo)為1的元素開始往前移,把下標(biāo)為0的元素覆蓋 //while (begin < ps->size) // //只要begin還小于有效元素個數(shù)就繼續(xù)往前移 // //因為是從下標(biāo)為1的元素開始移動, // //所以最后就只有下標(biāo)為0的元素沒動 //{ // //把當(dāng)前begin下標(biāo)的元素往前挪一位: // ps->a[begin - 1] = ps->a[begin]; // //當(dāng)前begin下標(biāo)元素移動后,begin++繼續(xù)移動下一位: // ++begin; //} // 因為第一個元素被覆蓋,所以有效元素size-- //ps->size--; //復(fù)用SLErase函數(shù) -- 改寫頭刪函數(shù)SLPopFront SLErase(ps, 0); //頭元素下標(biāo)是0 } //在指定位置(pos)插入想要的值(x) void SLInsert(SL* ps, int pos, SLDataType x) { //先使用assert檢查pos是否合法: //在pos位置插入一個值后,順序表還得是連續(xù)的 assert(pos >= 0 && pos <= ps->size); //pos等于0 -- 相等于頭插 //pos等于size -- 相等于尾插 //使用SLCheckCapacity進(jìn)行擴(kuò)容操作: SLCheckCapacity(ps); //定義一個變量end,對應(yīng)要移動元素的下標(biāo) int end = ps->size - 1; //一開始對應(yīng)最后一個元素的下標(biāo) while (end >= pos) //只要end下標(biāo)對應(yīng)的元素還在pos下標(biāo)元素的右邊 //就把“end元素”向右移,移到pos下標(biāo)無元素 { //把“end元素”向右移 ps->a[end + 1] = ps->a[end]; //移動下標(biāo)進(jìn)行寫一個元素的移動 --end; } //讓出位置后,將接收的x插入pos位置: ps->a[pos] = x; //有效元素+1: ps->size++; } //查找x這個值在順序表中的下標(biāo)是多少: int SLFind(SL* ps, SLDataType x) //返回找到的下標(biāo) { //assert斷言,防止接收空指針: assert(ps); //數(shù)據(jù)量不大的話直接暴力查找吧: for (int i = 0; i < ps->size; i++) //有幾個有效元素就循環(huán)幾次: { if (ps->a[i] == x) //該下標(biāo)元素等于要找的值x則返回當(dāng)前下標(biāo): { return i; } } return -1; //表未找到該元素下標(biāo) } //刪除指定位置(pos)的值: void SLErase(SL* ps, int pos) { //同樣先使用assert檢查pos是否合法: //這里檢查條件pos不能像SLInsert一樣等于size //因為size空了能插入(尾插),但不能刪除 assert(pos >= 0 && pos < ps->size); //指定刪除和頭刪的思路類似, //只要把pos后面的值往前覆蓋,覆蓋掉pos的值就好了: int begin = pos + 1; //從pos+1的位置往前挪 while (begin < ps->size) //一直移到size為止(不包括size位置) { ps->a[begin - 1] = ps->a[begin]; //往前挪 ++begin; //挪完繼續(xù)挪下一個 } ps->size--; //覆蓋掉pos位置的值后,有效數(shù)字減一 } //把pos位置的值修改為x void SLModify(SL* ps, int pos, SLDataType x) { //同樣先使用assert斷言檢查pos是否合法: assert(pos >= 0 && pos < ps->size); //進(jìn)行修改: ps->a[pos] = x; }
? ? ? ? ? ? ? ? ? ? ? ??
--------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ??
test.c -- 測試函數(shù)
#define _CRT_SECURE_NO_WARNINGS 1 //包含我們寫的 SeqList.h 頭文件 #include "SeqList.h" //分組測試,測試不同的函數(shù)--SLPushBack 和 SLPopBack 函數(shù) void TestSeqList1() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); //測試尾刪函數(shù)SLPopBack: SLPopBack(&sl); SLPopBack(&sl); //調(diào)用測試函數(shù)SPrint查看是否“刪除”成功: SLPrint(&sl); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //分組測試,測試不同的函數(shù)--SLPushFront函數(shù) void TestSeqList2() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); //測試頭插函數(shù)SLPushFront: SLPushFront(&sl, 10); SLPushFront(&sl, 20); //調(diào)用測試函數(shù)SPrint查看是否“刪除”成功: SLPrint(&sl); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //分組測試,測試不同的函數(shù)--SLPopFront函數(shù) void TestSeqList3() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); //測試頭刪函數(shù)SLPopFront: SLPopFront(&sl); SLPopFront(&sl); //調(diào)用測試函數(shù)SPrint查看是否“刪除”成功: SLPrint(&sl); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //分組測試,測試不同的函數(shù)--SLInsert函數(shù) void TestSeqList4() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); //測試指定增加函數(shù)SLInsert: SLInsert(&sl, 2, 100); //調(diào)用測試函數(shù)SPrint查看是否“刪除”成功: SLPrint(&sl); //int x; //scanf("%d", &x); //int pos = SLFind(&sl, x); //if (pos != -1) //{ // SLInsert(&sl, pos, x * 10); //} //SLPrint(&sl); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //分組測試,測試不同的函數(shù)--SLFind函數(shù) void TestSeqList5() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); //測試指定增加函數(shù)SLFind: int pos = SLFind(&sl, 2); printf("2在元素中是第%d個元素", pos+1); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //分組測試,測試不同的函數(shù)--SLErase函數(shù) void TestSeqList6() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); int x; scanf("%d", &x); //配合SLFind函數(shù),找到順序表中某個值的下標(biāo) int pos = SLFind(&sl, x); //再使用SLErase函數(shù)通過下標(biāo)刪除該值 if (pos != -1) { SLErase(&sl, pos); } SLPrint(&sl); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //分組測試,測試不同的函數(shù)--SLModify函數(shù) void TestSeqList7() { SL sl; //創(chuàng)建順序表類型變量 //使用 SLInit函數(shù) 初始化順序表類型變量 //注意傳遞的是變量的地址,防止形參改變實參不改變 SLInit(&sl); //使用尾插函數(shù)SLPushBack: SLPushBack(&sl, 1); SLPushBack(&sl, 2); SLPushBack(&sl, 3); SLPushBack(&sl, 4); //此時再調(diào)用會進(jìn)行擴(kuò)容: SLPushBack(&sl, 5); SLPushBack(&sl, 6); //調(diào)用測試函數(shù)SPrint查看是否插入成功: SLPrint(&sl); //測試指定增加函數(shù)SLInsert: SLModify(&sl, 2, 100); //調(diào)用測試函數(shù)SPrint查看是否“刪除”成功: SLPrint(&sl); //測試完后使用SLDestroy函數(shù)銷毀順序表: SLDestroy(&sl); } //菜單: void menu() { printf("********************************\n"); printf("1、尾插 2、頭插\n"); printf("3、頭刪 4、尾刪\n"); printf("7、打印 -1、退出\n"); printf("********************************\n"); } int main() { //先創(chuàng)建一個順序表: SL sl; //再對其進(jìn)行初始化: SLInit(&sl); //創(chuàng)建一個變量接收菜單選項: int option = 0; do { //使用菜單: menu(); //打印提示信息: printf("請選擇想要進(jìn)行的操作的序號:>"); //接收序號: scanf("%d", &option); printf("\n"); if (option == 1) { printf("請依次輸入你要插入的數(shù)據(jù)個數(shù):>"); int n = 0; //接收數(shù)據(jù)個數(shù) scanf("%d", &n); //接收數(shù)據(jù)個數(shù) printf("\n"); printf("請依次輸入你要插入的數(shù)據(jù)\n"); //知道數(shù)據(jù)個數(shù)后,直接使用for循環(huán)循環(huán)接收數(shù)據(jù) int x = 0; for (int i = 0; i < n; i++) { scanf("%d", &x); SLPushBack(&sl, x); } } else if (option == 7) { SLPrint(&sl); } } while (option != -1); //最后銷毀順序表: SLDestroy(&sl); //TestSeqList1(); //TestSeqList2(); //TestSeqList3(); //TestSeqList4(); //TestSeqList5(); //TestSeqList6(); //TestSeqList7(); return 0; }
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)初階】二、 線性表里的順序表(C語言實現(xiàn)順序表)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!