您好,登錄后才能下訂單哦!
這篇文章主要講解了C++如何實現基于靜態數組的順序表,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
實現的基本操作有:
1. 初始化
2. 尾插
3. 尾刪
4. 頭插
5. 頭刪
6.查找任意元素
7. 讀任意位置元素
8. 修改任意位置元素
9. 查找指定元素值的下標
10. 在任意位置插入元素
11.刪除指定位置的元素
12.刪除任意元素
13.打印數據
頭文件seqlist.h:
#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #define maxsize 1000//鏈表最多元素個數 typedef int seqType; typedef struct seqlist { seqType arr[maxsize];//數據域,存放數據 size_t size;//size_t是無符號長整型,是一種類型,size在數組中表示元素個數 }seqlist ; void PrintSeqList(seqlist *seq); //打印數據 void print_seqlist(char *s); //打印標題 void seqlistInit(seqlist *seq); //鏈表初始化 void seqlistPushBack(seqlist *seq, seqType value); //尾插元素,value是插入元素的值 void seqlistPopBack(seqlist *seq); //尾刪元素,value是插入元素的值 void seqlistPushHead(seqlist*seq, seqType value); //頭插元素 void seqlistPopHead(seqlist*seq); //頭刪元素 seqType seqlistFind(seqlist *seq, seqType data); //查找任意元素 seqType seqlistRead_pos(seqlist*seq, size_t pos); //讀取任意位置的元素 size_t seqlistFind_pos(seqlist*seq, seqType value); //查找指定元素的下標 seqType seqlistModify(seqlist*seq, size_t pos, seqType data); //修改任意位置的元素 void seqlistInsert_pos(seqlist *seq, size_t pos, seqType data); //在任意位置插入元素 void seqlistErase_pos(seqlist *seq, size_t pos); //刪除任意位置的元素 void seqlistRemove(seqlist *seq, seqType data); //刪除元素
實現文件seqlist.c
#include"seqlist.h" void PrintSeqList(seqlist *seq)//打印數據 { size_t i = 0; if (seq->size == 0) { printf("線性表為空,打印結束\n"); return; } for (i = 0; i < seq->size; i++) { printf("下標為%d的元素是:%d\n",i, seq->arr[i]); } printf("\n"); } void print_seqlist(char *s)//打印標題 { int i = 0; printf("%s\n",s); printf("\n"); } void seqlistInit(seqlist *seq)//鏈表初始化 { assert(seq); seq->size = 0;//有效元素賦值為0; } void seqlistPushBack(seqlist *seq, seqType value)//尾插元素,value是插入元素的值 { assert(seq);//判斷指針是否為空 if (seq->size == maxsize) { printf("元素已滿,無法插入\n"); return; } else seq->arr[seq->size++] = value; } void seqlistPopBack(seqlist *seq)//尾刪元素,value是插入元素的值 { assert(seq);//判斷指針是否為空 if (seq->size ==0) { printf("內容已為空,無法刪除\n"); return; } else seq->size--; } void seqlistPushHead(seqlist *seq, seqType value)//頭插元素 { assert(seq);//判斷指針是否為空 if (seq->size == maxsize) { printf("元素已滿,無法插入\n"); return; } else { int i = seq->size - 1; for (; i >= 0; i--) { seq->arr[i + 1] = seq->arr[i]; } seq->arr[0]=value; seq->size++; } } void seqlistPopHead(seqlist *seq)//頭刪元素 { assert(seq);//判斷指針是否為空 if (seq->size == 0) { printf("內容已為空,無法刪除\n"); return; } else { size_t i =1; for (; i < seq->size; i++) { seq->arr[i - 1] = seq->arr[i]; } seq->size--; } } seqType seqlistFind(seqlist *seq, seqType data)//查找任意元素 { size_t i = 0; assert(seq);//判斷指針是否為空 if (seq->size == 0) { printf("線性表為空\n"); return -1; } for (i = 0; i < seq->size - 1; i++) { if (seq->arr[i] == data) { return seq->arr[i]; } } return -1; } seqType seqlistRead_pos(seqlist *seq, size_t pos)//讀取任意位置的元素 { assert(seq);//判斷指針是否為空 if (seq->size == 0) { printf("內容為空,無法讀取內容\n"); return -1; } else if (pos> seq->size) { printf("讀取位置錯誤\n"); } else return seq->arr[pos]; } size_t seqlistFind_pos(seqlist *seq, seqType value)//查找指定元素的下標 { assert(seq);//判斷指針是否為空 size_t i= 0; for (; i < seq->size; i++) { if (seq->arr[i] == value) return i; } return -1; } seqType seqlistModify(seqlist *seq, size_t pos, seqType data)//修改任意位置元素 { assert(seq);//判斷指針是否為空 if (seq->size == 0) { printf("內容為空,無法修改內容\n"); return -1; } for (; pos < seq->size; pos++) { seq->arr[pos] = data; return seq->arr[pos]; } } void seqlistInsert_pos(seqlist *seq, size_t pos, seqType data)//在任意位置插入元素 { assert(seq); if (seq->size == maxsize) { printf("內容已滿,無法繼續插入內容\n"); return; } else if (pos>seq->size) { printf("非法位置,不允許插入\n"); return; } else { size_t m= seq->size ; for (m = seq->size; m > pos; m--) { seq->arr[m] = seq->arr[m-1]; } seq->arr[pos] = data; seq->size++; } } void seqlistErase_pos(seqlist *seq, size_t pos)//刪除任意位置的元素 { assert(seq); if (seq == NULL) { printf("內容已為空!\n"); return; } else if (pos > seq->size) { printf("該位置無法刪除!\n"); return; } else { size_t i ; for (i = pos; i < seq->size-1; i++) { seq->arr[i] = seq->arr[i+1]; }seq->size--; } } void seqlistRemove(seqlist *seq, seqType data)//刪除元素 { assert(seq);//判斷指針是否為空 size_t i = 0; i = seqlistFind_pos(seq,data); if (i >= 0) { while (i <seq->size) { seq->arr[i] = seq->arr[i + 1]; i++; } seq->size--; return; } else { printf("沒有找到該元素"); return; } }
在進行插入、刪除等操作中,若對元素的位置移動不清楚的借助畫圖能更好地理解。
測試函數test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"seqlist.h" void Test_PushBack()//測試順序表尾插元素 { print_seqlist("*****尾插3個元素至順序表*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 6); PrintSeqList(&seq); } void Test_PopBack()//測試順序表尾刪元素 { print_seqlist("*****尾刪順序表中的1個元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 6); PrintSeqList(&seq); seqlistPopBack(&seq); PrintSeqList(&seq); } void Test_PushHead()//頭插元素 { print_seqlist("*****頭插順序表中的3個元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushHead(&seq, 2); seqlistPushHead(&seq, 4); seqlistPushHead(&seq, 6); PrintSeqList(&seq); } void Test_PopHead()//頭刪元素 { print_seqlist("*****頭刪順序表中的1個元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushHead(&seq, 2); seqlistPushHead(&seq, 4); seqlistPushHead(&seq, 6); PrintSeqList(&seq); seqlistPopHead(&seq); PrintSeqList(&seq); } void Test_Find()//查找任意元素 { print_seqlist("*****查找順序表中的任意元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 6); PrintSeqList(&seq); int temp = 0; temp = seqlistFind(&seq,2); printf("查找到的元素是%d\n", temp); printf("\n"); } void Test_Read_pos()//讀取任意位置元素 { print_seqlist("*****查找順序表中的任意位置的元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 6); PrintSeqList(&seq); int temp = 0; temp=seqlistRead_pos(&seq, 1); printf("下標為1的元素是%d\n", temp); printf("下標為4的元素是:"); seqlistRead_pos(&seq, 4); printf("\n"); } void Test_seqlistFind_pos()//測試查找指定元素的下標 { print_seqlist("*****查找順序表中指定元素的下標*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 6); seqlistPushBack(&seq, 7); PrintSeqList(&seq); size_t pos = seqlistFind_pos(&seq, 4); size_t pos1 = seqlistFind_pos(&seq, 9); printf("元素4的下標為:%d\n", pos); printf("元素9的下標為:%d,元素不存在\n", pos1); printf("\n"); } void Test_seqlistModify()//修改任意位置元素 { print_seqlist("*****修改順序表中任意元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 6); seqlistPushBack(&seq, 7); PrintSeqList(&seq); int temp = seqlistModify(&seq, 1, 3); int temp1 = seqlistModify(&seq, 2, 8); PrintSeqList(&seq); printf("修改下標為1的元素為:%d\n", temp); printf("修改下標為2的元素為:%d\n", temp1); } void Test_seqlistInsert()//在任意位置插入元素 { print_seqlist("*****在順序表中任意位置插入元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 5); seqlistPushBack(&seq, 6); PrintSeqList(&seq); seqlistInsert_pos(&seq, 2, 3); PrintSeqList(&seq); seqlistInsert_pos(&seq, 8, 9); } void Test_seqlistErase_pos()//刪除任意位置元素 { print_seqlist("*****在順序表中刪除任意位置元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 5); seqlistPushBack(&seq, 6); PrintSeqList(&seq); seqlistErase_pos(&seq, 1); seqlistErase_pos(&seq, 4); PrintSeqList(&seq); } void Test_Remove()//刪除任意元素 { print_seqlist("*****在順序表中刪除任意元素*****"); seqlist seq; seqlistInit(&seq); seqlistPushBack(&seq, 2); seqlistPushBack(&seq, 4); seqlistPushBack(&seq, 5); seqlistPushBack(&seq, 6); PrintSeqList(&seq); seqlistRemove(&seq, 4); PrintSeqList(&seq); } int main() { Test_PushBack(); Test_PopBack(); Test_PushHead(); Test_PopHead(); Test_Find(); Test_Read_pos(); Test_seqlistFind_pos(); Test_seqlistModify(); Test_seqlistInsert(); Test_seqlistErase_pos(); Test_Remove(); return 0; }
看完上述內容,是不是對C++如何實現基于靜態數組的順序表有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。