顺序表可以看做一个数组,对数组进行操作,体会这一点,顺序表的相关操作就比较容易实现。
代码如下:
seqlist.h
#pragma once
#include <stddef.h>
#define SeqListMaxSize 1000
typedef char SeqListType;
typedef struct SeqList{
SeqListType data[SeqListMaxSize];
size_t size;
}SeqList;
//初始化
void SeqListInit(SeqList* seqlist);
//尾插
void SeqListPushBack(SeqList* seqlist ,SeqListType value);
//尾删
void SeqListPopBack(SeqList* seqlist);
//头插
void SeqListPushFront(SeqList* seqlist,SeqListType value);
//头删
void SeqListPopFront(SeqList* seqlist);
//给指定位置插入元素
void SeqListInsert(SeqList* seqlist,size_t pos,SeqListType va
//删除指定位置的元素
void SeqListErase(SeqList* seqlist,size_t pos);
//获取指定位置的值
int SeqListGet(SeqList* seqlist,size_t pos,SeqListType* value
//给指定位置设置值
void SeqListSet(SeqList* seqlist,size_t pos,SeqListType value
//找到某个元素的下标,返回下标
int SeqListFindPos(SeqList* seqlist,SeqListType value);
//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个
void SeqListRemove(SeqList* seqlist,SeqListType to_del);
//删除顺序表中所有相同的元素
void SeqListRemoveAll(SeqList* seqlist,SeqListType to_del);
//获取顺序表中元素的个数
int SeqListSize(SeqList* seqlist);
//顺序表判空,如果为空,返回1,否则返回0
int SeqListEmpty(SeqList* seqlist);
//冒泡排序
void SeqListBubbleSort(SeqList* seqlist);
//冒泡排序的扩展,可以指定升序,降序
//对Cmp比较函数作以下约定
//如果 a 和 b 满足比较规则,返回1,否则返回0
//满足比较规则具体值:
//如果是升序排序,a < b则称为满足比较规则
typedef int(*Cmp)(SeqListType a,SeqListType b);
void SeqListBubbleSortEx(SeqList* seqlist,Cmp cmp);
seqlist.c
1 #include <stdio.h>
2 #include "seqlist.h"
3
4 void SeqListInit(SeqList* seqlist){
5 if(seqlist == NULL){
6 //非法输入
7 return;
8 }
9 seqlist->size = 0;
10 return;
11 }
12
13 void SeqListPushBack(SeqList* seqlist,SeqListType value){
14 if(seqlist == NULL){
15 //非法输入
16 return;
17 }
18 if(seqlist->size == SeqListMaxSize){
19 //顺序表满
20 return;
21 }
22 seqlist->data[seqlist->size] = value;
23 seqlist->size++;
24 return;
25 }
26
27 void SeqListPopBack(SeqList* seqlist){
28 if(seqlist == NULL){
29 //非法输入
30 return;
31 }
32 if(seqlist->size == 0){
33 //空顺序表
34 return;
35 }
36 seqlist->size--;
37 return;
38 }
39
40 void SeqListPushFront(SeqList* seqlist,SeqListType value){
41 if(seqlist == NULL){
42 //非法输入
43 return;
44 }
45 if(seqlist->size == SeqListMaxSize){
46 //顺序表满
47 return;
48 }
49 seqlist->size++;
50 size_t i = seqlist->size-1;
51 for(;i>0;i--){
52 seqlist->data[i] = seqlist->data[i-1];
53 }
54 seqlist->data[0] = value;
55 return;
56 }
57
58 void SeqListPopFront(SeqList* seqlist){
59 if(seqlist == NULL){
60 //非法输入
61 return;
62 }
63 if(seqlist->size == 0){
64 //空顺序表
65 return;
66 }
67 size_t i = 0;
68 for(;i<seqlist->size;i++){
69 seqlist->data[i] = seqlist->data[i+1];
70 }
71 seqlist->size--;
72 return;
73 }
74
75 void SeqListInsert(SeqList* seqlist,size_t pos,SeqListType va
76 if(seqlist == NULL){
77 //非法输入
78 return;
79 }
80 if(seqlist->size == SeqListMaxSize){
81 //顺序表满
82 return;
83 }
84 seqlist->size++;
85 size_t i = seqlist->size-1;
86 for(;i>pos;i--){
87 seqlist->data[i] = seqlist->data[i-1];
88 }
89 seqlist->data[pos] = value;
90 return;
91 }
92
93 void SeqListErase(SeqList* seqlist,size_t pos){
94 if(seqlist == NULL){
95 //非法输入
96 return;
97 }
98 if(seqlist->size == 0){
99 //空顺序表
100 return;
101 }
102 size_t i = pos;
103 for(;i<seqlist->size;i++){
104 seqlist->data[i] = seqlist->data[i+1];
105 }
106 seqlist->size--;
107 return;
108 }
109
110 int SeqListGet(SeqList* seqlist,size_t pos,SeqListType* value
111 if(seqlist == NULL){
112 //非法输入
113 return 0;
114 }
115 if(pos >= seqlist->size){
116 //非法输入
117 return 0;
118 }
119 *value = seqlist->data[pos];
120 return 1;
121 }
122
123 void SeqListSet(SeqList* seqlist,size_t pos,SeqListType value
124 if(seqlist == NULL){
125 //非法输入
126 return;
127 }
128 if(pos >= seqlist->size){
129 //非法位置
130 return;
131 }
132 seqlist->data[pos] = value;
133 return;
134 }
135
136 int SeqListFindPos(SeqList* seqlist,SeqListType value){
137 if(seqlist == NULL){
138 //非法输入
139 return 0;
140 }
141 size_t i = 0;
142 for(;i<seqlist->size;i++){
143 if(seqlist->data[i] == value){
144 return i;
145 }
146 }
147 return -1;
148 }
149
150 void SeqListRemove(SeqList* seqlist,SeqListType to_del){
151 if(seqlist == NULL){
152 //非法输入
153 return;
154 }
155 size_t pos = SeqListFindPos(seqlist,to_del);
156 if(pos ==(size_t) -1){
157 //没找到
158 return;
159 }
160 SeqListErase(seqlist,pos);
161 return;
162 }
163
164 void SeqListRemoveAll(SeqList* seqlist,SeqListType to_del){
165 if(seqlist == NULL){
166 //非法输入
67 return;
168 }
169 while(1){
170 size_t pos = SeqListFindPos(seqlist,to_del);
171 if(pos == (size_t) -1){
172 break;
173 }
174 SeqListErase(seqlist,pos);
175 }
176 return;
177 }
178
179 int SeqListSize(SeqList* seqlist){
180 if(seqlist == NULL){
181 //非法输入
182 return 0;
183 }
184 return seqlist->size;
185 }
186
187 int SeqListEmpty(SeqList* seqlist){
188 if(seqlist == NULL){
189 //非法输入
190 return -1;
191 }
192 if(seqlist->size == 0){
193 return 1;
194 }
195 return 0;
196 }
197
198 void swap(SeqListType* a,SeqListType* b){
199 SeqListType tmp = *a;
200 *a = *b;
201 *b = tmp;
202 }
203 void SeqListBubbleSort(SeqList* seqlist){
204 if(seqlist == NULL){
205 //非法输入
206 return;
207 }
208 size_t count = 0;
209 for(;count<seqlist->size;count++){
210 size_t i = 0;
211 for(i=0;i<seqlist->size - count - 1;i++){
212 if(seqlist->data[i]>seqlist->data[i+1]){
213 swap(&seqlist->data[i],&seqlist->data[i+1]);
214 }
215 }
216 }
217 return;
218 }
219
220 void SeqListBubbleSortEx(SeqList* seqlist,Cmp cmp){
221 if(seqlist == NULL){
222 //非法输入
223 return;
224 }
225 size_t count = 0;
226 for(;count<seqlist->size;count++){
227 size_t cur = 0;
228 for(cur=0;cur<seqlist->size - count - 1;cur++){
229 if(!cmp(seqlist->data[cur],seqlist->data[cur+1]))
230 swap(&seqlist->data[cur],&seqlist->data[cur+1
231
232 }
233 }
234 }
235 return;
236 }