服务器之家

服务器之家 > 正文

C++实现基于静态数组的顺序表

时间:2021-09-07 15:21     来源/作者:get_it_started

本文实例为大家分享了C++实现基于静态数组的顺序表,供大家参考,具体内容如下

实现的基本操作有:

1. 初始化
2. 尾插
3. 尾删
4. 头插
5. 头删
6.查找任意元素
7. 读任意位置元素
8. 修改任意位置元素
9. 查找指定元素值的下标
10. 在任意位置插入元素
11.删除指定位置的元素
12.删除任意元素
13.打印数据

头文件seqlist.h:

?
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
#pragma once
 
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
 
#define maxsize 1000//链表最多元素个数
 
typedef int seqType;
typedef struct seqlist
{
  seqType arr[maxsize];//数据域,存放数据
  size_t size;//size_t是无符号长整型,是一种类型,size在数组中表示元素个数
}seqlist ;
 
void PrintSeqList(seqlist *seq); //打印数据
void print_seqlist(char *s); //打印标题
void seqlistInit(seqlist *seq); //链表初始化
 
void seqlistPushBack(seqlist *seq, seqType value); //尾插元素,value是插入元素的值
void seqlistPopBack(seqlist *seq); //尾删元素,value是插入元素的值
 
void seqlistPushHead(seqlist*seq, seqType value); //头插元素
void seqlistPopHead(seqlist*seq); //头删元素
 
seqType seqlistFind(seqlist *seq, seqType data); //查找任意元素
seqType seqlistRead_pos(seqlist*seq, size_t pos); //读取任意位置的元素
size_t seqlistFind_pos(seqlist*seq, seqType value); //查找指定元素的下标
 
seqType seqlistModify(seqlist*seq, size_t pos, seqType data); //修改任意位置的元素
void seqlistInsert_pos(seqlist *seq, size_t pos, seqType data); //在任意位置插入元素
 
void seqlistErase_pos(seqlist *seq, size_t pos); //删除任意位置的元素
void seqlistRemove(seqlist *seq, seqType data); //删除元素

实现文件seqlist.c

?
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#include"seqlist.h"
void PrintSeqList(seqlist *seq)//打印数据
{
  size_t i = 0;
  if (seq->size == 0)
  {
    printf("线性表为空,打印结束\n");
    return;
  }
  for (i = 0; i < seq->size; i++)
  {
    printf("下标为%d的元素是:%d\n",i, seq->arr[i]);
  }
  printf("\n");
}
 
void print_seqlist(char *s)//打印标题
{
  int i = 0;
  printf("%s\n",s);
  printf("\n");
}
 
void seqlistInit(seqlist *seq)//链表初始化
{
  assert(seq);
  seq->size = 0;//有效元素赋值为0;
}
 
void seqlistPushBack(seqlist *seq, seqType value)//尾插元素,value是插入元素的值
{
  assert(seq);//判断指针是否为空
  if (seq->size == maxsize)
  {
    printf("元素已满,无法插入\n");
    return;
  }
  else
  seq->arr[seq->size++] = value;
}
 
void seqlistPopBack(seqlist *seq)//尾删元素,value是插入元素的值
{
  assert(seq);//判断指针是否为空
  if (seq->size ==0)
  {
    printf("内容已为空,无法删除\n");
    return;
  }
  else
    seq->size--;
}
 
void seqlistPushHead(seqlist *seq, seqType value)//头插元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == maxsize)
  {
    printf("元素已满,无法插入\n");
    return;
  }
  else
  {
    int i = seq->size - 1;
    for (; i >= 0; i--)
    {
      seq->arr[i + 1] = seq->arr[i];
    }
    seq->arr[0]=value;
    seq->size++;
  }
}
 
void seqlistPopHead(seqlist *seq)//头删元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("内容已为空,无法删除\n");
    return;
  }
  else
  {
    size_t i =1;
    for (; i < seq->size; i++)
    {
      seq->arr[i - 1] = seq->arr[i];
    }
    seq->size--;
  }
}
 
seqType seqlistFind(seqlist *seq, seqType data)//查找任意元素
{
  size_t i = 0;
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("线性表为空\n");
    return -1;
  }
  for (i = 0; i < seq->size - 1; i++)
  {
    if (seq->arr[i] == data)
    {
      return seq->arr[i];
    }
  }
  return -1;
}
 
 
 
seqType seqlistRead_pos(seqlist *seq, size_t pos)//读取任意位置的元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("内容为空,无法读取内容\n");
    return -1;
  }
  else if (pos> seq->size)
  {
    printf("读取位置错误\n");
  }
  else
      return seq->arr[pos];
}
 
size_t seqlistFind_pos(seqlist *seq, seqType value)//查找指定元素的下标
{
  assert(seq);//判断指针是否为空
  size_t i= 0;
  for (; i < seq->size; i++)
    {
      if (seq->arr[i] == value)
        return i;
    }
  return -1;
}
 
seqType seqlistModify(seqlist *seq, size_t pos, seqType data)//修改任意位置元素
{
  assert(seq);//判断指针是否为空
  if (seq->size == 0)
  {
    printf("内容为空,无法修改内容\n");
    return -1;
  }
  for (; pos < seq->size; pos++)
  {
    seq->arr[pos] = data;
    return seq->arr[pos];
  }
}
 
void seqlistInsert_pos(seqlist *seq, size_t pos, seqType data)//在任意位置插入元素
{
  assert(seq);
  if (seq->size == maxsize)
  {
    printf("内容已满,无法继续插入内容\n");
    return;
  }
  else if (pos>seq->size)
  {
    printf("非法位置,不允许插入\n");
    return;
  }
  else
  {
    size_t m= seq->size ;
    for (m = seq->size; m > pos; m--)
    {
      seq->arr[m] = seq->arr[m-1];
    }
    seq->arr[pos] = data;
    seq->size++;
  }
}
 
void seqlistErase_pos(seqlist *seq, size_t pos)//删除任意位置的元素
{
  assert(seq);
  if (seq == NULL)
  {
    printf("内容已为空!\n");
    return;
  }
  else if (pos > seq->size)
  {
    printf("该位置无法删除!\n");
    return;
  }
  else
  {
    size_t i ;
    for (i = pos; i < seq->size-1; i++)
    {
      seq->arr[i] = seq->arr[i+1];
    }seq->size--;
  }
}
 
void seqlistRemove(seqlist *seq, seqType data)//删除元素
{
  assert(seq);//判断指针是否为空
  size_t i = 0;
  i = seqlistFind_pos(seq,data);
  if (i >= 0)
  {
    while (i <seq->size)
    {
      seq->arr[i] = seq->arr[i + 1];
      i++;
    }
    seq->size--;
    return;
  }
  else
  {
    printf("没有找到该元素");
    return;
  }
}

在进行插入、删除等操作中,若对元素的位置移动不清楚的借助画图能更好地理解。

测试函数test.c

?
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"
 
void Test_PushBack()//测试顺序表尾插元素
{
  print_seqlist("*****尾插3个元素至顺序表*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
}
 
void Test_PopBack()//测试顺序表尾删元素
{
  print_seqlist("*****尾删顺序表中的1个元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistPopBack(&seq);
  PrintSeqList(&seq);
 
}
 
void Test_PushHead()//头插元素
{
  print_seqlist("*****头插顺序表中的3个元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushHead(&seq, 2);
  seqlistPushHead(&seq, 4);
  seqlistPushHead(&seq, 6);
  PrintSeqList(&seq);
 
}
 
void Test_PopHead()//头删元素
{
  print_seqlist("*****头删顺序表中的1个元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushHead(&seq, 2);
  seqlistPushHead(&seq, 4);
  seqlistPushHead(&seq, 6);
  PrintSeqList(&seq);
  seqlistPopHead(&seq);
  PrintSeqList(&seq);
 
}
 
void Test_Find()//查找任意元素
{
  print_seqlist("*****查找顺序表中的任意元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  int temp = 0;
  temp = seqlistFind(&seq,2);
  printf("查找到的元素是%d\n", temp);
  printf("\n");
}
 
void Test_Read_pos()//读取任意位置元素
{
  print_seqlist("*****查找顺序表中的任意位置的元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  int temp = 0;
  temp=seqlistRead_pos(&seq, 1);
  printf("下标为1的元素是%d\n", temp);
  printf("下标为4的元素是:");
  seqlistRead_pos(&seq, 4);
  printf("\n");
}
 
void Test_seqlistFind_pos()//测试查找指定元素的下标
{
  print_seqlist("*****查找顺序表中指定元素的下标*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  seqlistPushBack(&seq, 7);
  PrintSeqList(&seq);
  size_t pos = seqlistFind_pos(&seq, 4);
  size_t pos1 = seqlistFind_pos(&seq, 9);
  printf("元素4的下标为:%d\n", pos);
  printf("元素9的下标为:%d,元素不存在\n", pos1);
  printf("\n");
}
 
void Test_seqlistModify()//修改任意位置元素
{
  print_seqlist("*****修改顺序表中任意元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 6);
  seqlistPushBack(&seq, 7);
  PrintSeqList(&seq);
  int temp = seqlistModify(&seq, 1, 3);
  int temp1 = seqlistModify(&seq, 2, 8);
  PrintSeqList(&seq);
  printf("修改下标为1的元素为:%d\n", temp);
  printf("修改下标为2的元素为:%d\n", temp1);
 
}
 
void Test_seqlistInsert()//在任意位置插入元素
{
  print_seqlist("*****在顺序表中任意位置插入元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 5);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistInsert_pos(&seq, 2, 3);
  PrintSeqList(&seq);
  seqlistInsert_pos(&seq, 8, 9);
}
 
void Test_seqlistErase_pos()//删除任意位置元素
{
  print_seqlist("*****在顺序表中删除任意位置元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 5);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistErase_pos(&seq, 1);
  seqlistErase_pos(&seq, 4);
  PrintSeqList(&seq);
}
 
void Test_Remove()//删除任意元素
{
  print_seqlist("*****在顺序表中删除任意元素*****");
  seqlist seq;
  seqlistInit(&seq);
  seqlistPushBack(&seq, 2);
  seqlistPushBack(&seq, 4);
  seqlistPushBack(&seq, 5);
  seqlistPushBack(&seq, 6);
  PrintSeqList(&seq);
  seqlistRemove(&seq, 4);
  PrintSeqList(&seq);
}
 
int main()
{
  Test_PushBack();
  Test_PopBack();
  Test_PushHead();
  Test_PopHead();
  Test_Find();
  Test_Read_pos();
  Test_seqlistFind_pos();
  Test_seqlistModify();
  Test_seqlistInsert();
  Test_seqlistErase_pos();
  Test_Remove();
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/getitstarted/article/details/78826402

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部