1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define MAXSIZE 20 //存储空间大小
5
6 typedef int data_t;
7
8 //线性表结构
9 typedef struct
10 {
11 data_t data[MAXSIZE]; //数组,存储数据元素
12 int len; //线性表长度(从 1 开始)
13 }sqlist;
14
15
16 //创建线性表
17 sqlist* create_sqlist()
18 {
19 sqlist* L = (sqlist*)malloc(sizeof(sqlist));
20 if (L == NULL)
21 {
22 perror("malloc");
23 return NULL;
24 }
25 L->len = 0;
26 return L;
27 }
28
29
30 //初始化线性表
31 int init_sqlist(sqlist* L)
32 {
33 L->len = 0; //初始化为 0,当增加元素时从 1 开始计数
34 return 1;
35 }
36
37
38 //线性表长度
39 int length_sqlist(sqlist* L)
40 {
41 return L->len;
42 }
43
44
45 //返回第 i 个位置的元素(按位置查找)
46 int get_elem(sqlist* L, int i)
47 {
48 if (L->len == 0 || i < 1 || i > L->len)
49 return -1;
50 data_t data = L->data[i - 1];
51 return data;
52 }
53
54
55 //返回线性表中与给定值相等的元素的位置(按值查找)
56 int get_locate(sqlist* L, data_t data)
57 {
58 //线性表为空
59 if (L->len == 0)
60 return -1;
61
62 //遍历查找
63 int i = 0; //i 为下表,返回 i+1
64 while (i < L->len)
65 {
66 if (L->data[i] == data)
67 return i + 1;
68 ++i;
69 }
70 //遍历完整个线性表都没有找到
71 if (i >= L->len)
72 return -1;
73 }
74
75
76 //插入元素
77 int insert_elem(sqlist* L, int loca, data_t data)
78 {
79 if (L->len == MAXSIZE) //线性表已满
80 return -1;
81 if (loca < 1 || loca > L->len + 1) //可以插到最后一个元素的后面,所以插入的位置可以等于线性表长度+
82 return -1;
83
84 //开始插入
85 for (int i = L->len - 1; i >= loca - 1; --i) //len 和 loca 都是从 1 开始的,但是 i 是下标,所以 len 和 loca 都要减 1
86 {
87 L->data[i + 1] = L->data[i];
88 }
89 L->data[loca - 1] = data; //插入新元素
90 ++L->len;
91
92 return 1;
93 }
94
95
96 //删除元素(按位置删除)
97 int delete_elem(sqlist* L, int loca)
98 {
99 if (L->len == 0)
100 return -1;
101 if (loca < 1 || loca > L->len)
102 return -1;
103
104 //开始删除
105 for (int i = loca; i < L->len; ++i) //将该位置(从 0 开始)后面的数依次前移
106 L->data[i - 1] = L->data[i];
107 L->len--;
108
109 return 1;
110 }
111
112 //修改元素(按位置查找)
113 int change_elem(sqlist* L, int loca, data_t data)
114 {
115 if (L->len == 0)
116 return -1;
117 if (loca < 1 || loca > L->len)
118 return -1;
119
120 //开始修改
121 L->data[loca - 1] = data;
122
123 return 1;
124 }
125
126
127 //打印线性表
128 void show_sqlist(sqlist* L)
129 {
130 for (int i = 0; i < L->len; ++i)
131 printf("%d ", L->data[i]);
132 printf("\n");
133 }
134
135
136
137 int main()
138 {
139 int i; //下标
140 int len; //长度
141
142 //创建线性表
143 sqlist* L = create_sqlist();
144
145 //线性表的长度
146 printf("新建线性表的长度:len = ");
147 len = length_sqlist(L);
148 printf("%d\n", len);
149
150 //在头位置插入
151 printf("在第一个位置插入5个数:");
152 for (i = 1; i <= 5; ++i)
153 insert_elem(L, 1, i);
154
155 //打印
156 show_sqlist(L);
157
158 //求长度
159 printf("插入5个元素后的线性表长度:len = ");
160 len = length_sqlist(L);
161 printf("%d\n", len);
162
163 //按位置查找(从 1 开始)
164 int elem = get_elem(L, 3);
165 printf("第 3 个位置的元素为:%d\n", elem);
166
167 //按值查找
168 int loca = get_locate(L, 4);
169 printf("4 在第 %d 个位置\n", loca);
170
171 //删除元素
172 delete_elem(L, 1);
173 printf("删除第 1 个元素:");
174 show_sqlist(L);
175
176 //修改元素
177 printf("将第 2 个位置的数据改为 100:");
178 change_elem(L, 2, 100);
179 show_sqlist(L);
180
181
182 return 0;
183 }