日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构C语言实现顺序表——增删查改操作实现详解

發(fā)布時間:2024/5/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构C语言实现顺序表——增删查改操作实现详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

順序表

順序表是什么?

順序表是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示。實(shí)現(xiàn)增刪查改的功能。

順序表所需的頭文件:

#include<stdio.h> #include<stdlib.h> #include<assert.h>

目錄

順序表

靜態(tài)順序表

動態(tài)順序表

動態(tài)順序表

順序表的創(chuàng)建

順序表的初始化

順序表的銷毀

打印順序表

擴(kuò)容

尾插

頭插

尾刪

頭刪

任意位置刪除

任意位置插入

元素的查找

元素修改

測試代碼和菜單


?順序表分為靜態(tài)順序表和動態(tài)順序表。

靜態(tài)順序表

靜態(tài)順序表的空間不可改變,使用確定大小的數(shù)組來確定元素。

靜態(tài)順序表的創(chuàng)建:

typedef struct SeqList {int arr[512];int size; //數(shù)組中元素的個數(shù) };

動態(tài)順序表

動態(tài)順序表的空間可以被改變,使用動態(tài)內(nèi)存函數(shù)開辟數(shù)組儲存元素

動態(tài)順序表的創(chuàng)建:

typedef struct SeqList {int* a;int size; //有多少元素int capaclity; //容量 };

靜態(tài)順序表和動態(tài)順序表的區(qū)別在于容量是否可變。

我們本節(jié)介紹動態(tài)順序表。

動態(tài)順序表

順序表的創(chuàng)建

我們用一個指針開辟一個空間,既順序表元素的空間。由于我們指針不一定是int型,為了嚴(yán)謹(jǐn)一定,我們自定義一個數(shù)據(jù)類型:

typedef int SEQ;

?然后就可以創(chuàng)建一個完整的順序表:

typedef struct SeqLisrt {SEQ* a;int size; //順序表中有多少元素int capaciti; //順序表的空間大小 }SL;

順序表的初始化

順序表第一次使用前需要初始化:

void Init(SL* ps) {ps->a = NULL;ps->size = 0;ps->capaciti = 0; }

順序表的銷毀

順序表在使用完以后需要進(jìn)行銷毀保障安全:

void Destory(SL* ps) {free(ps->a);ps->a = NULL;ps->size = 0;ps->capaciti = 0; }

使用free函數(shù)釋放掉空間,并將其設(shè)置為空指針NULL。

打印順序表

為了直觀的看到順序表里的元素,我們需要一個打印順序表的函數(shù):

void Print(SL* ps) {int i = 0;for (i=0;i<ps->size;i++){printf("%d ",ps->a[i]);} }

擴(kuò)容

當(dāng)順序表中的size>=capaciti是需要擴(kuò)容,此時順序表的空間不夠用,那我們怎么進(jìn)行擴(kuò)容?

由于,最開始使用數(shù)據(jù)表順序表被初始化,capaciti為0,將capiaciti的容量賦予在?*2

其次賦予a新的空間,由于此時a為NULL,直接開辟新的空間會報(bào)警告,我們用一個中間變量tmp開啟一塊capaciti元素*2的空間,在將這塊空間賦予a。

實(shí)現(xiàn)代碼:

void CheckCapacity(SL* ps) {if (ps->size == ps->capaciti){int newcapaciti = ps->capaciti == 0 ? 4 : ps->capaciti * 2; SEQ* tmp = (SEQ*)realloc(ps->a, newcapaciti * sizeof(SEQ)*2);ps->a = tmp;ps->capaciti = newcapaciti;} }

實(shí)現(xiàn)以上準(zhǔn)備工作后,我們進(jìn)入順序表重點(diǎn),增刪查改功能的實(shí)現(xiàn)了。

尾插

size為順序表中的元素個數(shù),每當(dāng)插入一個新元素后size++;

尾插:將新的元素放到順序表最后一個元素的后面:?

代碼實(shí)現(xiàn):

void PushBack(SL* ps, SEQ x) {CheckCapacity(ps); //自定義的擴(kuò)容函數(shù)ps->a[ps->size] = x;ps->size++; }

在對順序表插入新元素的,使用自己寫的擴(kuò)容函數(shù)判斷一下。

頭插

?

頭插:順序表的元素往后移位,將新的元素放到順序表的最前面:

void PushFront(SL* ps, SEQ x) {CheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end+1] = ps->a[end];end--;}ps->a[0] = x;ps->size++; }

尾刪

將最后的元素刪去:

操作方法:將size--;

代碼實(shí)現(xiàn):

void PopBack(SL* ps) {ps->size--; }

頭刪

將順序表的第一個元素刪掉。

操作方法:將順序表的第一個元素后面的元素往前移一位,size--;

代碼實(shí)現(xiàn):

void PopFront(SL* ps) {int start = 1;while (start < ps->size){ps->a[start - 1] = ps->a[start];start++;}ps->size--; }

任意位置刪除

pos為下標(biāo) 既要刪除元素的位置。

?實(shí)現(xiàn)方法和頭刪類似后面的元素覆蓋掉前面的元素。

代碼實(shí)現(xiàn):

void Erase(SL* ps, int pos) {int start = pos;while (start < ps->size - 1){ps->a[start] = ps->a[start + 1];start++;}ps->size--; }

任意位置插入

?和頭插類似,將元素往后移動在放入元素。

代碼實(shí)現(xiàn):

void Insert(SL* ps, int pos, SEQ x) {int end = ps->size - 1;while (end > +pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++; }

元素的查找

使用循環(huán)以此查找,直到找到元素或順序表沒有此元素

找到元素返回下標(biāo),沒有找到返回-1;

代碼實(shí)現(xiàn):

int Find(SL* ps, int pos) {int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == pos){return i;}}return -1; }

元素修改

找到想修改的位置直接修改即可。

代碼實(shí)現(xiàn):

void At(SL* ps, int pos, SEQ x) {ps->a[pos] = x; }

以上就是增刪查改實(shí)現(xiàn)的全過程。

接下來我們來測試代碼

測試代碼和菜單

測試結(jié)果:

?測試菜單代碼:

void menu() {printf("********************************\n");printf("1.尾插數(shù)據(jù) 2.頭插數(shù)據(jù)\n");printf("3.尾刪數(shù)據(jù) 4.頭刪數(shù)據(jù)\n");printf("5.任意插入 6.任意刪除\n");printf("7.修改數(shù)據(jù) 8.查找數(shù)據(jù)\n");printf("9.打印數(shù)據(jù) -1.退出\n");printf("********************************\n");printf("請輸入你操作的選項(xiàng)>:"); }int main() {int option = 0;int x = 0;int i = 0;int pos = 0;SL s;Init(&s); //使用順序表前先初始化while (option != -1){menu();scanf("%d", &option);switch (option){case 1:printf("請輸入你要尾插的數(shù)據(jù),以-1結(jié)束\n");do{scanf("%d", &x);if (x != -1){PushBack(&s, x);}} while (x != -1);break;case 2:printf("請輸入你要頭插的數(shù)據(jù),以-1結(jié)束\n");do{scanf("%d", &x);if (x != -1){PushFront(&s, x);}} while (x != -1);break;case 3:printf("請輸入你要尾刪的元素個數(shù)\n");scanf("%d", &x);for (i = 0; i < x; i++){PopBack(&s);}break;case 4:printf("請輸入你要頭刪的元素個數(shù)\n");scanf("%d", &x);for (i = 0; i < x; i++){PopFront(&s);}break;case 5:printf("請輸入要插入的位置以及插入的數(shù)據(jù)\n");scanf("%d%d", &pos, &x);Insert(&s, pos, x);break;case 6:printf("請輸入要刪除的位置\n");scanf("%d", &pos);Erase(&s, pos);break;case 7:printf("請輸入位置以及修改的數(shù)據(jù)\n");scanf("%d%d", &pos, &x);At(&s, pos, x);break;case 8:printf("請輸入需要查找的數(shù)據(jù)\n");scanf("%d", &x);int ret = Find(&s, x);if (ret != -1){printf("找到了下標(biāo)為:>%d\n", ret);}elseprintf("找不到\n");break;case 9:Print(&s);printf("\n");break;default:break;}}Destory(&s);//使用完后銷毀return 0; }

?

以上就是本知識點(diǎn)的內(nèi)容了。

求點(diǎn)個贊!!!!!!

總結(jié)

以上是生活随笔為你收集整理的数据结构C语言实现顺序表——增删查改操作实现详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。