最近复习数据结构,写了一个顺序存储的线性表,代码粘在这里:)

代码下载:git@github.com:Wang-Sen/algorithm.git

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
159
160
161
/*
* Simple array implementation.
*/

#include <stdbool.h>

#define MAX_SIZE 50
#define data_t int
#define array_length_t int

#define ERR_OUT_OF_RANGE -1
#define ERR_EMPTY_ARRAY -2
#define ERR_INVALID_ARGS -3

typedef struct {
data_t data[MAX_SIZE];
array_length_t length;
} array;

static inline void array_init(array *arr)
{
for (int i = 0; i < MAX_SIZE; i++) {
arr->data[i] = 0;
}
arr->length = 0;
}

static inline void show_array(array *arr)
{
for (int i=0; i < arr->length; i++) {
printf("%d ", arr->data[i]);
}
printf("\n");
}

static inline bool is_array_empty(array *arr)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
return !arr->length;
}

static inline array_length_t len(array *arr) {
if (!arr) {
return ERR_INVALID_ARGS;
}
return arr->length;
}

static inline int locate_entry(array *arr, data_t entry) {
if (!arr) {
return ERR_INVALID_ARGS;
}
int ret = -1;
for (int i = 0; i < MAX_SIZE; i++) {
if (arr->data[i] == entry) {
ret = i;
return ret;
}
}
return ret;
}

static inline int array_push(array *arr, data_t entry)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
if ((arr->length + 1) > MAX_SIZE) {
return ERR_OUT_OF_RANGE;
}
arr->data[arr->length] = entry;
(arr->length)++;
return 0;
}

static inline int array_pop(array *arr, data_t *p_entry)
{
if (arr->length <= 0) {
return ERR_EMPTY_ARRAY;
}
if (!p_entry || !arr) {
return ERR_INVALID_ARGS;
}

*p_entry = arr->data[arr->length - 1];
(arr->length)--;

return 0;
}

static inline int array_insert(array *arr, int loc, data_t entry)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
if ((arr->length + 1) > MAX_SIZE || loc < 0 || loc >= MAX_SIZE) {
return ERR_OUT_OF_RANGE;
}
for (int i = arr->length; i > loc; i--) {
arr->data[i] = arr->data[i - 1];
}
arr->data[loc] = entry;
(arr->length)++;
return 0;
}

static inline int array_delete(array *arr, int loc, data_t *entry)
{
if (!arr || !entry) {
return ERR_INVALID_ARGS;
}
if (loc < 0 || loc >= arr->length) {
return ERR_OUT_OF_RANGE;
}

*entry = arr->data[loc];
for (int i = loc; i < (arr->length) - 1; i++) {
arr->data[i] = arr->data[i + 1];
}
(arr->length)--;
return 0;
}

static inline int array_update(array *arr, int loc, data_t entry)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
if (!arr->length) {
return ERR_EMPTY_ARRAY;
}
if (loc < 0 || loc >= arr->length) {
return ERR_OUT_OF_RANGE;
}
arr->data[loc] = entry;
return 0;
}

static inline int array_reverse(array *arr)
{
if (!arr) {
return ERR_INVALID_ARGS;
}

int i, j, tmp;
for (i = 0, j = (arr->length - 1); j - i > 0; i++, j--) {
if (arr->data[i] == arr->data[j]) {
tmp = arr->data[i];
arr->data[i] = arr->data[j];
arr->data[j] = tmp;
} else {
arr->data[i] ^= arr->data[j];
arr->data[j] ^= arr->data[i];
arr->data[i] ^= arr->data[j];
}
}

return 0;
}

测试代码:

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
#include <stdio.h>
#include <unistd.h>
#include "array.h"

int main(int argc, char **argv) {
int ret = 0, i;
array list;
array_init(&list);

/* test is_empty_array */
printf("Empty array: %d\n", is_array_empty(&list));
list.data[0] = 2400;
list.length += 1;
printf("Empty array: %d\n", is_array_empty(&list));
/* end test is_empty_array */

/* test push */
for (i = list.length; i < MAX_SIZE; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %d\n", ret);
printf("length: %d\n", list.length);
printf("Entry: %d\n", i);
}
}

show_array(&list);

if ((ret = array_push(&list, 20))) {
printf("Err: %d\n", ret);
printf("length: %d\n", list.length);
printf("Entry: %d\n", 20);
}
/* end test push */

/* test insert */
array_init(&list);
for (i = list.length; i < MAX_SIZE-1; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %d\n", ret);
printf("length: %d\n", list.length);
printf("Entry: %d\n", i);
}
}
array_insert(&list, 3, 5);
show_array(&list);

array_insert(&list, 3, 6);
show_array(&list);

array_init(&list);
for (i = list.length; i < MAX_SIZE-1; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %d\n", ret);
printf("length: %d\n", list.length);
printf("Entry: %d\n", i);
}
}
array_insert(&list, MAX_SIZE, 5);
show_array(&list);
/* end test insert */

/* test locate_entry */
array_init(&list);
for (i = list.length; i < MAX_SIZE; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %d\n", ret);
printf("length: %d\n", list.length);
printf("Entry: %d\n", i);
}
}
printf("location of 5 is: %d\n", locate_entry(&list, 5));
printf("location of 10 is: %d\n", locate_entry(&list, 10));
printf("location of 100 is: %d\n", locate_entry(&list, 100));
printf("location of -100 is: %d\n", locate_entry(&list, -100));
/* end test locate_entry */

/* test len*/
array_init(&list);
for (i = 0; i < 38; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %d\n", ret);
printf("length: %d\n", list.length);
printf("Entry: %d\n", i);
}
}
printf("len : %d\n", len(&list));
/* end test len */

/* test pop */
array_init(&list);
int j = 0;
for (i = 0; i < 26; i++) {
array_push(&list, j);
j += 2;
}
show_array(&list);
for (i = 0; i < 27; i++) {
array_pop(&list, &j);
printf("Pop Entry: %d\n", j);
show_array(&list);
}
/* end test pop */

/* test delete*/
array_init(&list);
for (i = 0; i < 26; i++) {
array_push(&list, j);
j += 2;
}
show_array(&list);
for (i = 0; i < 27; i++) {
if (array_delete(&list, i, &j) != 0) {
printf("Delete %dth entry error!\n", i);
break;
}
printf("Deleted Entry: %d\n", j);
show_array(&list);
}
/* end test delete */

/* test update*/
array_init(&list);
for (i = 0, j = 0; i < 26; i++) {
array_push(&list, j);
j += 2;
}
show_array(&list);
for (i = 0; i < 28; i++) {
if (array_update(&list, i, 99) != 0) {
printf("Update %dth entry error!\n", i);
break;
}
printf("Updated %dth Entry: %d\n", i, j);
show_array(&list);
}
/* end test update */

/* test reverse*/
array_init(&list);
for (i = 0; i < MAX_SIZE; i++) {
array_push(&list, i);
}
show_array(&list);
array_reverse(&list);
show_array(&list);
/* end test reverse */
}