1.
順序表(Sequence List)是一種線性表的實(shí)現(xiàn)方式,通過(guò)連續(xù)的內(nèi)存空間存儲(chǔ)元素,按照順序排列。
順序表的特點(diǎn)包括:
- 元素在內(nèi)存中的存儲(chǔ)是連續(xù)的,通過(guò)數(shù)組實(shí)現(xiàn)。
- 元素之間的邏輯順序與物理順序一致。
- 可以根據(jù)元素的索引直接訪問(wèn)和修改元素。
- 需要預(yù)先分配足夠的內(nèi)存空間,容量固定。
順序表常見(jiàn)的操作包括:
- 創(chuàng)建:通過(guò)動(dòng)態(tài)內(nèi)存分配,創(chuàng)建一個(gè)具有指定容量的順序表。
- 銷毀:釋放順序表占用的內(nèi)存空間。
- 清空:將順序表中的元素清空,使其為空表。
- 插入:在指定位置插入一個(gè)元素,后面的元素依次后移。
- 刪除:刪除指定位置的元素,后面的元素依次前移。
- 訪問(wèn):根據(jù)索引訪問(wèn)指定位置的元素。
- 查詢:根據(jù)元素的值查找元素在順序表中的位置。
- 修改:根據(jù)索引修改指定位置的元素的值。
- 排序:對(duì)順序表中的元素進(jìn)行排序,常用的算法有冒泡排序、插入排序、快速排序等。
- 遍歷:按照順序依次訪問(wèn)順序表中的元素。
優(yōu)點(diǎn):
隨機(jī)訪問(wèn)效率高,可以直接通過(guò)索引定位元素,不需要遍歷,不容易產(chǎn)生內(nèi)存碎片
缺點(diǎn):
插入和刪除操作需要移動(dòng)大量元素,效率較低,并且容量固定,無(wú)法動(dòng)態(tài)擴(kuò)容。
另外注意的是,在使用順序表時(shí),需要進(jìn)行邊界檢查,避免越界訪問(wèn)。此外,插入和刪除元素時(shí)需要注意維護(hù)順序表的邏輯和物理順序一致性。
代碼實(shí)現(xiàn)
設(shè)計(jì)順序表結(jié)構(gòu)
// 設(shè)計(jì)順序表結(jié)構(gòu)
typedef struct Array
{
TYPE* ptr; // 存儲(chǔ)元素的內(nèi)存首地址
size_t cal; // 表的容量
size_t cnt; // 元素的數(shù)量
}Array;
創(chuàng)建
// 創(chuàng)建
Array* create_array(size_t cal)
{
Array* arr = malloc(sizeof(Array)); // 給順序表結(jié)構(gòu)分配內(nèi)存
arr->ptr = malloc(sizeof(TYPE)*cal); // 給數(shù)據(jù)元素分配內(nèi)存
arr->cal = cal; // 給數(shù)據(jù)元素分配內(nèi)存
arr->cnt = 0; // 初始化元素的數(shù)量
return arr;
}
銷毀
// 銷毀
void destroy_array(Array* arr)
{
free(arr->ptr);
free(arr);
}
清空
// 銷毀
void destroy_array(Array* arr)
{
free(arr->ptr);
free(arr);
}
插入
// 插入
bool insert_array(Array* arr,size_t index,TYPE data)
{
// 判斷表是否滿
if(arr->cnt >= arr->cal) return false;
// 判斷下標(biāo)是否能保持元素的連續(xù)性
if(index > arr->cnt) return false;
// 數(shù)據(jù)向后移動(dòng)
for(int i=arr->cnt; i>index; i--)
{
arr->ptr[i] = arr->ptr[i-1];
}
// 插入數(shù)據(jù)
arr->ptr[index] = data;
arr->cnt++;
return true;
}
刪除
// 刪除
bool delete_array(Array* arr,size_t index)
{
if(index >= arr->cnt) return false; //判斷表是否滿
for(int i=index; i<arr->cnt-1; i++)
{
arr->ptr[i] = arr->ptr[i+1];
}
arr->cnt--;
return true;
}
訪問(wèn)
// 訪問(wèn)
bool access_array(Array* arr,size_t index,TYPE* data)
{
if(index >= arr->cnt) return false;
*data = arr->ptr[index];
return true;
}
查詢
// 查詢
int query_array(Array* arr,TYPE data)
{
for(int i=0; i<arr->cnt; i++)
if(arr->ptr[i] == data) return i;
return -1;
}
修改
// 修改
bool modify_array(Array* arr,size_t index,TYPE data)
{
if(index >= arr->cnt) return false;
arr->ptr[index] = data;
return true;
}
排序
// 排序
void sort_array(Array* arr)
{
for(int i=0; i<arr->cnt-1; i++)
{
for(int j=i+1; j<arr->cnt; j++)
{
if(arr->ptr[j] < arr->ptr[i])
{
TYPE temp = arr->ptr[j];
arr->ptr[j] = arr->ptr[i];
arr->ptr[i] = temp;
}
}
}
}
遍歷文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-843469.html
// 遍歷
void show_array(Array* arr)
{
for(int i=0; i<arr->cnt; i++)
{
printf(PH,arr->ptr[i]);
}
printf("\n");
}
完整代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-843469.html
-
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <string.h> #define TYPE int #define PH "%d " // 設(shè)計(jì)順序表結(jié)構(gòu) typedef struct Array { TYPE* ptr; // 存儲(chǔ)元素的內(nèi)存首地址 size_t cal; // 表的容量 size_t cnt; // 元素的數(shù)量 }Array; // 創(chuàng)建 Array* create_array(size_t cal) { // 給順序表結(jié)構(gòu)分配內(nèi)存 Array* arr = malloc(sizeof(Array)); // 給數(shù)據(jù)元素分配內(nèi)存 arr->ptr = malloc(sizeof(TYPE)*cal); // 記錄表的容量 arr->cal = cal; // 初始化元素的數(shù)量 arr->cnt = 0; return arr; } // 銷毀 void destroy_array(Array* arr) { free(arr->ptr); free(arr); } // 清空 void clear_array(Array* arr) { arr->cnt = 0; } // 插入 bool insert_array(Array* arr,size_t index,TYPE data) { // 判斷表是否滿 if(arr->cnt >= arr->cal) return false; // 判斷下標(biāo)是否能保持元素的連續(xù)性 if(index > arr->cnt) return false; // 數(shù)據(jù)向后移動(dòng) for(int i=arr->cnt; i>index; i--) { arr->ptr[i] = arr->ptr[i-1]; } // 插入數(shù)據(jù) arr->ptr[index] = data; arr->cnt++; return true; } // 刪除 bool delete_array(Array* arr,size_t index) { if(index >= arr->cnt) return false; for(int i=index; i<arr->cnt-1; i++) { arr->ptr[i] = arr->ptr[i+1]; } arr->cnt--; return true; } // 訪問(wèn) bool access_array(Array* arr,size_t index,TYPE* data) { if(index >= arr->cnt) return false; *data = arr->ptr[index]; return true; } // 查詢 int query_array(Array* arr,TYPE data) { for(int i=0; i<arr->cnt; i++) if(arr->ptr[i] == data) return i; return -1; } // 修改 bool modify_array(Array* arr,size_t index,TYPE data) { if(index >= arr->cnt) return false; arr->ptr[index] = data; return true; } // 排序 void sort_array(Array* arr) { for(int i=0; i<arr->cnt-1; i++) { for(int j=i+1; j<arr->cnt; j++) { if(arr->ptr[j] < arr->ptr[i]) { TYPE temp = arr->ptr[j]; arr->ptr[j] = arr->ptr[i]; arr->ptr[i] = temp; } } } } // 遍歷 void show_array(Array* arr) { for(int i=0; i<arr->cnt; i++) { printf(PH,arr->ptr[i]); } printf("\n"); } int main(int argc,const char* argv[]) { Array* arr = create_array(10); for(int i=0; i<5; i++) { insert_array(arr,0,i+1); } insert_array(arr,1,8); delete_array(arr,5); show_array(arr); int num = 0; if(access_array(arr,5,&num)) printf("num=%d\n",num); else printf("index error\n"); printf("index=%d\n",query_array(arr,80)); sort_array(arr); clear_array(arr); show_array(arr); destroy_array(arr); }
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法 --順序表的創(chuàng)建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!