C语言版顺序表的建立和增删改查
来自数据结构C语言第二版中顺序表的建立和增删改查
文章内容:顺序表的建立, 取值, 查找, 修改,插入, 删除。
二、使用步骤
1.引入库
代码如下(示例):
#include<stdio.h> //调用基本输入/输出库文件
#include<stdlib.h> //调用标准库头文件,malloc函数在这个头文件中
#include<process.h> //使用系统库文件,暂停一下,看到执行结果
最后的代码
核心思想:插入和删除,在顺序表中,只需要将批量移动便可完成, 只不过是前移和后移的问题。作用:解决了数组的固定长度,和不能插入和删除操作的弊端。
顺序表的构建
// 顺序表的构建
#include<stdio.h>
#include<stdlib.h> //malloc函数在这个头文件库中
#include<process.h> //这个是系统暂停所用
#define MAX 100 //顺序表最大长度
typedef struct Seq
{
int elem[MAX]; //数组元素
int length; //长度
}RSeq;
//构建一个顺序表
RSeq init()
{
RSeq *R1;
R1 = (struct Seq*)malloc(sizeof(struct Seq));
R1->length = 0;
for (int i = 0; i < 10; i++)
{
R1->elem[i] = i + 1;
R1->length++;
}
return *R1;
}
//取值
int Seq_getValue(RSeq R, int index)
{
if (index < 0 && index > R.length)
{
printf("位置不合法");
exit(0);
}
return R.elem[index];
}
//查找
int Seq_locateElem(RSeq R, int elem)
{
int flag = 0;
for (int i = 0; i < R.length; i++) //顺序查找,遍历顺序表便可
{
if (R.elem[i] == elem)
{
return i;
}
}
return -1; //查找失败
}
//插入
void Seq_insert(RSeq* L, int index, int elem)
{
if (index < 0 && index > L->length)
{
printf("位置不合法");
exit(0);
}
else {
for (int i = L->length - 1; i >= index; i--)
L->elem[i + 1] = L->elem[i];
//增加一个空位置往后移动,在index后面
L->elem[index] = elem;
L->length++;
}
}
//修改
void Seq_revise(RSeq *L, int index, int value)
{
if (index < 0 && index > L->length)
{
printf("位置不合法");
exit(0);
}
else
{
L->elem[index] = value;
}
}
//删除
void Seq_delete(RSeq* L, int k) //k是删除的位置
{
if (k < 0 && k > L->length)
{
printf("位置不合法");
exit(0);
}
else
{
for (int i = k; i <= L->length - 1; i++)
L->elem[i] = L->elem[i+1]; //前移补全空缺
L->length--;
}
}
//打印结果
void display(RSeq R)
{
for (int i = 0; i < R.length; i++)
{
printf("%4d", R.elem[i]);
}
}
int main()
{
RSeq A;
A = init(); //构造一个顺序表
printf("最原始的顺序表:");
display(A);
printf("\n");
printf("顺序表取值:%d\n",Seq_getValue(A, 2));
printf("顺序表查找值为7的下标:%d\n", Seq_locateElem(A,7));
printf("顺序表插入之后的顺序表:");
Seq_insert(&A, 4, 13);
display(A);
printf("\n顺序表修改下标为2的值之后的顺序表:");
Seq_revise(&A, 2, 11);
display(A);
printf("\n顺序表删除下标为2和4的值之后的顺序表:");
Seq_delete(&A, 2);
Seq_delete(&A, 3);
//删除一个之后表长减一, 上一次删除之后的下标会受到影响,前面则不会。
display(A);
system("pause");
return 0;
}
/*结果为:
最原始的顺序表:
1 2 3 4 5 6 7 8 9 10
顺序表取值:3
顺序表查找值为7的下标:6
顺序表插入之后的顺序表:
1 2 3 4 13 5 6 7 8 9 10
顺序表修改下标为2的值之后的顺序表:
1 2 11 4 13 5 6 7 8 9 10
顺序表删除下标为2和4的值之后的顺序表:
1 2 4 5 6 7 8 9 10
*/