順序表的插入操作原理及實現(C語言)詳解
阿新 • • 發佈:2018-12-16
順序表中存放資料的特點和陣列這種資料型別完全吻合,所以順序表的實現使用的是陣列。換句話說,順序表中插入元素問題也就等同於討論如何向陣列中插入資料。
因此,順序表中插入資料元素,無非三種情況:
無論在順序表的什麼位置插入資料元素,解決辦法都是:找到要插入的位置,將後續資料元素整體向後移動一個位置,最後直接在騰出來的位置上插入指定的資料元素。
順序表插入資料操作的 C 語言實現程式碼為:
注意,在此程式中,當陣列儲存空間不足時,使用realloc函式每次額外多申請 1 個 int 型的儲存空間,這麼做還不是最優。最好的辦法就是每次發現空間不夠時,多申請幾個記憶體空間,這麼做的好處是:在後續做插入操作過程中不需要每次都執行 realloc 函式,提高了程式的執行效率。
完整程式如下(可執行):
輸出結果:
因此,順序表中插入資料元素,無非三種情況:
- 在表頭插入;
- 在表的中間某個位置插入;
- 直接尾隨順序表,作為表的最後一個元素;
無論在順序表的什麼位置插入資料元素,解決辦法都是:找到要插入的位置,將後續資料元素整體向後移動一個位置,最後直接在騰出來的位置上插入指定的資料元素。
順序表插入資料操作的 C 語言實現程式碼為:
//插入函式,其中,elem為插入的元素,add為插入到順序表的位置
table addTable(table t,int elem,int add)
{
//判斷插入本身是否存在問題(如果插入元素位置比整張表的長度+1還大(如果相等,是尾隨的情況),
//或者插入的位置本身不存在,程式作為提示並自動退出)
if (add>t.length+1||add<1) {
printf("插入位置有問題");
return t;
}
//做插入操作時,首先需要看順序表是否有多餘的儲存空間提供給插入的元素,如果沒有,需要申請
if (t.length==t.size) {
t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
if (!t.head) {
printf("儲存分配失敗");
return t;
}
t.size+=1;
}
//插入操作,需要將從插入位置開始的後續元素,逐個後移
for (int i=t.length-1; i>=add-1; i--) {
t.head[i+1]=t.head[i];
}
//後移完成後,直接將所需插入元素,新增到順序表的相應位置
t.head[add-1]=elem;
//由於添加了元素,所以長度+1
t.length++;
return t;
}
完整程式如下(可執行):
#include <stdio.h> #include <stdlib.h> #define Size 4 typedef struct Table{ int * head; int length; int size; }table; table initTable(){ table t; t.head=(int*)malloc(Size*sizeof(int)); if (!t.head) { printf("初始化失敗"); exit(0); } t.length=0; t.size=Size; return t; } table addTable(table t,int elem,int add) { if (add>t.length+1||add<1) { printf("插入位置有問題"); return t; } if (t.length>=t.size) { t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int)); if (!t.head) { printf("儲存分配失敗"); } t.size+=1; } for (int i=t.length-1; i>=add-1; i--) { t.head[i+1]=t.head[i]; } t.head[add-1]=elem; t.length++; return t; } void displayTable(table t){ for (int i=0;i<t.length;i++) { printf("%d",t.head[i]); } printf("\n"); } int main(){ table t1=initTable(); for (int i=1; i<=Size; i++) { t1.head[i-1]=i; t1.length++; } printf("原順序表:\n"); displayTable(t1); printf("在第2的位置插入元素5:\n"); t1=addTable(t1, 5, 2); displayTable(t1); return 0; }
原順序表: 1234 在第2的位置插入元素5: 15234