資料結構 順序表程式碼

該文章使用 Google 翻譯處理。

程式碼

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdio.h>
#include <stdlib.h> // malloc()、exit()

#define Size 5  // 對 Size 進行巨集定義,表示順序表申請空間的大小

typedef struct Table
{
    int * head; // 宣告了一個名為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;   // 空表的長度初始化為 0
    t.size = Size;  // 空表的初始儲存空間為 Size

    return t;
}

// 插入函數,其中,elem 為插入的元素,add 為插入到順序表的位置
table addTable(table t, int elem, int add)
{
    int i;

    // 判斷插入本身是否有問題(如果插入元素位置比整張表的長度 +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 (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;
}

// 刪除函數
table delTable(table t, int add) 
{
    int i;

    if (add > t.length || add < 1) 
    {
        printf("被刪除元素的位置有誤");
        exit(0);
    }
    for (i = add; i < t.length; i++) 
    {
        t.head[i - 1] = t.head[i];
    }

    t.length--;

    return t;
}

// 尋找函數,其中,elem 表示要尋找的資料元素的值
int selectTable(table t, int elem) 
{
    int i;
    
    for (i = 0; i < t.length; i++) 
    {
        if (t.head[i] == elem) 
        {
            return i + 1;
        }
    }

    return -1;
}

// 更改函數,其中,elem 為要更改的元素,newElem 為新的資料元素
table amendTable(table t, int elem, int newElem) 
{
    int add = selectTable(t, elem);

    t.head[add - 1] = newElem;

    return t;
}

// 輸出順序表中元素的函數
void displayTable(table t) 
{
    int i;

    for (i = 0; i < t.length; i++) 
    {
        printf("%d ", t.head[i]);
    }
    printf("\n");
}

int main() {
    int i, add;

    table t1 = initTable();

    // 在順序表中新增元素
    for (i = 1; i <= Size; i++) 
    {
        t1.head[i - 1] = i;
        t1.length++;
    }

    printf("原順序表:\n");
    displayTable(t1);

    printf("刪除元素 1:\n");
    t1 = delTable(t1, 1);
    displayTable(t1);

    printf("在第 2 的位置插入元素 5:\n");
    t1 = addTable(t1, 5, 2);
    displayTable(t1);

    printf("尋找元素 3 的位置:\n");
    add = selectTable(t1, 3);
    printf("%d\n", add);
    
    printf("將元素 3 改為 6:\n");
    t1 = amendTable(t1, 3, 6);
    displayTable(t1);

    return 0;
}

結果

程式運行結果為:

原順序表: 1 2 3 4 5
刪除元素 1:
2 3 4 5
在第 2 的位置插入元素 5:
2 5 3 4 5
尋找元素 3 的位置:
3
將元素 3 改為 6:
2 5 6 4 5

This post is licensed under CC BY-NC-SA 4.0 by the author.