简单静态顺序表实现
本篇全部代码都在Linux系统下完成
概念:
用一段地址连续的单元依次存储数据元素的线性结构,顺序表又分为静态顺序表和动态顺序表
功能:
- 初始化顺序表
- 在表尾插入数据
- 在表头插入数据
- 删除表尾数据
- 删除表头数据
- 读取任意位置元素
- 修改任意位置元素
- 查找指定元素值的下标
- 在表中任意位置插入元素
首先创建一个结构体Seqlist,在结构体中我们定义了一个数组seqlist,用来存放数据,以及一个无符号整形变量size,用来控制顺序表有效数据的个数。
即我们通过一个简单的数组实现顺序表的一些功能
8 #define SeqlistMax 50
9 typedef char Type;
10 typedef struct Seqlist{
11 Type seqlist[SeqlistMax];
12 size_t size;
13 }Seq;
接下来我们将顺序表初始化一下
4 void SeqlistInit(Seq* seq)
5 {
6 if(NULL == seq){
7 printf("INPUT ERROR!\n");
8 return;
9 }
10 seq->size = 0;
11 }
我们在用指针当做形参时,必须要判断其是否为空,如果不为空,才能进行接下来的工作。初始化完成之后我们再进行接下来的功能实现,函数内部只实现一个数据的插入与删除,如果想进行多个数据的操作,可以在测试函数中实现。
- 尾部插入
26 void SeqlistPushBack(Seq* seq ,Type A)
27 {
28
29 if(NULL == seq){
30 printf("INPUT ERROR!\n");
31 return;
32 }
33 if(seq->size>=SeqlistMax){
34 printf("The excel is full\n");
35 return;
36 }//判断顺序表是否已存满数据
37 seq->seqlist[seq->size]= A;
38 seq->size++;//size+1 即说明表中插入一个数据,在这里我们通过size的大小来简单
39 } //地控制表的大小(不是实际大小,而是有效数据的个数)
- 尾部删除
41 void SeqlistPopBack(Seq* seq)
42 {
43 if(NULL == seq){
44 printf("INPUT ERROR!\n");
45 return;
46 }
47 if(seq->size==0){
48 printf("The excel is empty\n");
49 return;
50 }//判断顺序表是否为空
51 seq->size--;//size--说明有效数据减一,即原来表尾的数据已经不在有效范围内
52 }
- 头部插入
53 void SeqlistPushTop(Seq* seq ,Type A)
54 {
55
56 if(NULL == seq){
57 printf("INPUT ERROR!\n");
58 return;
59 }
60 if(seq->size>=SeqlistMax){
61 printf("The excel is full\n");
62 return;
63 }
64 int i=0;
65 for(i=seq->size;i>0;i--){
66 seq->seqlist[i]=seq->seqlist[i-1];
67 }//将原有有效数据统统向后移一位
68 seq->seqlist[i]=A;//头部原有数据被新数据代替,实现插入功能
69 seq->size++;//插入一个数据,size便需要加1
70 }
- 头部删除
72 void SeqlistPopTop(Seq* seq)
73 {
74 if(NULL == seq){
75 printf("INPUT ERROR!\n");
76 return;
77 }
78
79 if(seq->size==0){
80 printf("The excel is empty\n");
81 return;
82 }
83 int i=0;
84 for(i=0;i<seq->size;i++){
85 seq->seqlist[i]=seq->seqlist[i+1];
86 }//将原有有效数据统统向前移动一位
87 seq->size--;//删除一个数据,size--,说明有效数据减一
88 }
- 读取任意位置元素
90 void SeqlistReadPos(Seq* seq,int Pos)//这里的Pos并不是数组下标的意思,例如该顺序表有效数据为4,则Pos值若为3的话
91 { //便是第3个元素,即下标为2的数组元素,因为数组的起始下标为0
92
93 if(NULL == seq){
94 printf("INPUT ERROR!\n");
95 return;
96 }
97 if(seq->size==0){
98 printf("The excel is empty\n");
99 return;
100 }
101 if((Pos>seq->size)||(Pos<=0)){//控制Pos值输入合法,在有效范围内
102 printf("INPUT ERROR!\n");
103 return;
104 }
105 printf("[%c]\n",seq->seqlist[Pos-1]);
106 }
- 修改任意位置元素
109 void SeqlistReplacePos(Seq* seq,int Pos,Type A)
110 {
111
112 if(NULL == seq){
113 printf("INPUT ERROR!\n");
114 return;
115 }
116 if(seq->size==0){
117 printf("The excel is empty\n");
118 return;
119 }
120 if((Pos>seq->size)||(Pos<=0)){
121 printf("INPUT ERROR!\n");
122 return;
123 }
124 seq->seqlist[Pos-1]=A;
125 }
- 查找任意元素值的下标(这里的下标不是数组里的元素下标,而是该元素在有效数据内的排序)
127 void SeqlistFindPos(Seq* seq,Type A)
128 {
129
130 if(NULL == seq){
131 printf("INPUT ERROR!\n");
132 return;
133 }
134 if(seq->size==0){
135 printf("The excel is empty\n");
136 return;
137 }
138 int i = 0;
139 for(i=0;i<seq->size;i++){
140 if(seq->seqlist[i]==A){
141 printf("%d ",i+1);
142 }
143 }
144 printf("\n");
145 }
- 在表中任意位置插入元素
147 void SeqlistPushPos(Seq* seq,int Pos,Type A)
148 {
149
150 if(NULL == seq){
151 printf("INPUT ERROR!\n");
152 return;
153 }
154 if(seq->size>=SeqlistMax){
155 printf("The excel is full\n");
156 return;
157 }
158 if((Pos>seq->size)||(Pos<=0)){
159 printf("INPUT ERROR!\n");
160 return;
161 }
162 int i = 0;
163 for(i=seq->size;i>=Pos;i--){
164 seq->seqlist[i]=seq->seqlist[i-1];
165 }
166 seq->seqlist[i]=A;
167 seq->size++;
168 }