1. 程式人生 > >順序表的插入操作原理及實現(C語言)詳解

順序表的插入操作原理及實現(C語言)詳解

順序表中存放資料的特點和陣列這種資料型別完全吻合,所以順序表的實現使用的是陣列。換句話說,順序表中插入元素問題也就等同於討論如何向陣列中插入資料。

因此,順序表中插入資料元素,無非三種情況:
  • 在表頭插入;
  • 在表的中間某個位置插入;
  • 直接尾隨順序表,作為表的最後一個元素;

無論在順序表的什麼位置插入資料元素,解決辦法都是:找到要插入的位置,將後續資料元素整體向後移動一個位置,最後直接在騰出來的位置上插入指定的資料元素。

順序表插入資料操作的 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;
}
注意,在此程式中,當陣列儲存空間不足時,使用realloc函式每次額外多申請 1 個 int 型的儲存空間,這麼做還不是最優。最好的辦法就是每次發現空間不夠時,多申請幾個記憶體空間,這麼做的好處是:在後續做插入操作過程中不需要每次都執行 realloc 函式,提高了程式的執行效率。

完整程式如下(可執行):
#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