ch2_线性表_顺序表的删除,查找与更改

代码

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
#include <stdio.h>
#include <stdlib.h>
#define Size 5 //对Size进行宏定义,表示顺序表申请空间的大小

typedef struct Table{
int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
int length;//记录当前顺序表的长度
int size;//记录顺序表分配的存储容量
}table;

table initTable(){
table t;
t.head=(int*)malloc(Size*sizeof(int));//构造一个空的顺序表,动态申请存储空间
if (!t.head) //如果申请失败,作出提示并直接退出程序
{
printf("初始化失败");
exit(0);
}
t.length=0;//空表的长度初始化为0
t.size=Size;//空表的初始存储空间为Size
return t;
}

//输出顺序表中元素的函数
void displayTable(table t){
for (int i=0;i<t.length;i++) {
printf("%d ",t.head[i]);
}
printf("\n");
}


//插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
table addTable(table t,int elem,int add)
{
//判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
if (add>t.length+1||add<1) {
printf("插入位置有问题");
return t;
}
//做插入操作时,首先需要看顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
if (t.length==t.size) {
printf("初始分配的内存size不足,请求增加分配\n");
t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
if (!t.head) {
printf("存储分配失败");
return t;
}
printf("存储分配成功!\n");
printf("\n");
t.size+=1;
//printf("%d",t.size);
}
//插入操作,需要将从插入位置开始的后续元素,逐个后移
for (int i=t.length-1; i>=add-1; i--) {
t.head[i+1]=t.head[i];
}
//后移完成后,直接将所需插入元素,添加到顺序表的相应位置
t.head[add-1]=elem;
//由于添加了元素,所以长度+1
t.length++;
//printf("新长度:%d",t.length);
return t;
}

table delete(table t,delete_loc){
if(delete_loc<1||delete_loc>t.length){
printf("位置有误\n");
exit(0);
}
for(int i=delete_loc-1;i<t.length;i++){
t.head[i]=t.head[i+1];
}
t.length--;
return t;
}

/*这样子也可以的
table delete(table t,int add){
if (add>t.length || add<1) {
printf("被删除元素的位置有误");
exit(0);
}
//删除操作
for (int i=add; i<t.length; i++) {
t.head[i-1]=t.head[i];
}
t.length--;
return t;
}
*/


//查找函数,返回所查找的元素的位置
int findelem(table t,int elem){
for(int i=0;i<t.length;i++){
if(t.head[i]==elem) return i+1;
}
return -1;//没找到返回-1

}

//把顺序表中某个位置处的元素值替换为指定元素的函数

table replace(table t,int elem,int newelem){
//首先调用上面的查找函数找到elem所在位置
int loc=findelem(t,elem);
if(loc!=-1){
t.head[loc-1]=newelem;
}
else{
printf("待替换的元素不在顺序表中,以下输出(若有)为原顺序表:\n");
}


return t;
}


int main(){
table t=initTable();
//向顺序表中添加元素
for (int i=1; i<=Size; i++) {
t.head[i-1]=i;
t.length++;
}

printf("插入之前,顺序表中存储的元素分别是:\n");
displayTable(t);
printf("插入之前,顺序表的长度为%d\n",t.length);
printf("\n");

table newt=addTable(t,9,1);//在第一个位置插入元素“9”
printf("插入之后,顺序表中存储的元素分别是:\n");
displayTable(newt);
printf("插入之后,顺序表的长度为%d\n",newt.length);
printf("\n");

table dt=delete(newt,1);//删除newt第一个位置,即下标为0的位置处的元素
printf("删除之后,顺序表中存储的元素分别是:\n");
displayTable(dt);
printf("删除之后,顺序表的长度为%d",dt.length);
printf("\n");

printf("\n");
int elem_loc=findelem(dt,9);//在t中查找元素"9"
if(elem_loc!=-1) printf("所查找的元素在第%d个位置\n",elem_loc);
else printf("所查找元素不在顺序表中\n");
printf("\n");

table latest_t=replace(t,2,2333);//用2333替换2
printf("替换之后的顺序表元素为“\n");
displayTable(latest_t);


return 0;
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
插入之前,顺序表中存储的元素分别是:
1 2 3 4 5
插入之前,顺序表的长度为5

初始分配的内存size不足,请求增加分配
存储分配成功!

插入之后,顺序表中存储的元素分别是:
9 1 2 3 4 5
插入之后,顺序表的长度为6

删除之后,顺序表中存储的元素分别是:
1 2 3 4 5
删除之后,顺序表的长度为5

所查找元素不在顺序表中

替换之后的顺序表元素为“
1 2333 3 4 5

我的笔迹

1
同样注意,调用的删除,查找与更改函数同上一节中的插入函数一样都会引起t的改变
凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条