线性表顺序存储实现
- 顺序表的存储结构
<span style="font-size:14px;">#define MAXSIZE 100 typedef int datatype; typedef struct{ datatype a[MAXSIZE]; //定义一个大小为100的int类型数组 int size; //size是存储这个数组中有意义数据的个数 }sequence_list;</span>
- 顺序表基本实现
<span style="font-size:14px;">void init (sequence_list *slt); //顺序表的初始化——置空表 void append (sequence_list *slt, datatype x); //在顺序表后部插入值为x的结点 void display (sequence_list *slt); //打印顺序表的各结点值 int empty(sequence_list slt); //判断顺序表是否为空 int find(sequence_list slt, datatype x); //查找顺序表中值为x的结点位置 datatype get(sequence_list slt, int i); //取得顺序表中第i个结点的值 void insert(sequence_list *slt, datatype x, int position); //在顺序表的position位置插入值为x的结点 void dele(sequence_list *slt, int position); //删除表中第position位置的结点</span>
- sequlist.c文件
<span style="font-size:14px;">#include <stdlib.h> #include <stdio.h> #include "sequlist.h" /************************************************************************/ /* 函数功能: 顺序表的初始化——置空表 */ /* 函数参数: 指向sequence_list型变量的指针变量slt */ /* 函数返回值:空 */ /* 文件名:sequlist.c, 函数名:init() */ /************************************************************************/ void init (sequence_list *slt) { slt->size = 0; for (int i=0; i<MAXSIZE; i++) { slt->a[i] = 0; } } /************************************************************************/ /* 函数功能: 在顺序表后部进行插入操作 */ /* 函数参数: 指向sequence_list型变量的指针slt */ /* datatype类型的变量x */ /* 函数返回值: 空 */ /* 文件名: sequlist.c, 函数名: append() */ /************************************************************************/ void append (sequence_list *slt, datatype x) { if (slt->size == MAXSIZE) { printf("顺序表是满的!"); exit(1); } slt->a[slt->size] = x; //将x值写入顺序表后面 slt->size = slt->size + 1; //slt->size指向的是顺序表中当前存储数值的下一个位置 } /************************************************************************/ /* 函数功能: 打印顺序表的各结点值 */ /* 函数参数: sequence_list型变量slt */ /* 函数返回值: 空 */ /* 文件名: sequlist.c,函数名: display() */ /************************************************************************/ void display (sequence_list *slt) { int i; if (!slt->size) { printf("\n顺序表的空的!"); } else { for (i=0;i<slt->size;i++) { printf("%c",slt->a[i]); //printf("%5d",slt->a[i]); } } printf("\n"); } /************************************************************************/ /* 函数功能:判断顺序表是否为空 */ /* 函数参数:sequence_list型变量slt */ /* 函数返回值: int类型。 1表示空,0表示非空 */ /* 文件名: sequlist.c,函数名: empty() */ /************************************************************************/ int empty(sequence_list slt) { return(slt.size==0 ? 1 : 0); } /************************************************************************/ /* 函数功能: 查找顺序表中值为x的结点位置 */ /* 函数参数: sequence_list型变量slt,datatype型变量x */ /* 函数返回值:int类型。返回x的位置值,-1表示没有找到 */ /* 文件名: sequlist.c,函数名:find() */ /************************************************************************/ int find(sequence_list slt, datatype x) { int i = 0; while (i<slt.size && slt.a[i] != x) //i从0初始位置开始遍历,循环在i遍历完整个顺序表停止,或者在查找到x停止,并显示查找到的当前i值 { i++; } return(i<slt.size ? i : -1); } /************************************************************************/ /* 函数功能: 取得顺序表中的第i个结点的值 */ /* 函数参数: sequence_list型变量slt,int型变量i */ /* 函数返回值: datatype类型。返回第i个结点的值 */ /* 文件名:sequlist.c,函数名: get() */ /************************************************************************/ datatype get(sequence_list slt, int i) { if (i<0 || i>=slt.size) { printf("\n指定位置的结点不存在!"); exit(1); } else { return slt.a[i]; } } /************************************************************************/ /* 函数功能: 在顺序表的position位置插入值为x的结点 */ /* 函数参数: 指向sequence_list型变量的指针slt */ /* datatype型变量x,int型变量position */ /* 函数返回值: 空 */ /* 文件名: sequlist.c,函数名: insert() */ /************************************************************************/ void insert(sequence_list *slt, datatype x, int position) { int i; if (slt->size == MAXSIZE) { printf("/n顺序表是满的!没法插入!"); exit(1); } if (position<0 || position>slt->size) { printf("/n指定的插入位置不存在!"); exit(1); } for (i=slt->size; i>position; i--) //这个循环里面是将position开始的数组值移到下一个位置 { slt->a[i] = slt->a[i-1]; } slt->a[position] = x; slt->size++; } /************************************************************************/ /* 函数功能: 删除顺序表中第position位置的结点 */ /* 函数参数: 指向sequence_list型变量的指针变量slt */ /* int型变量position */ /* 函数返回值: 空 */ /* 文件名:sequlist.c,函数名:dele() */ /************************************************************************/ void dele(sequence_list *slt, int position) { int i; if (slt->size == 0) { printf("/n顺序表是空的!"); exit(1); } if (position<0 || position>=slt->size) { printf("/n指定的删除位置不存在!"); exit(1); } for (i=position; i<slt->size; i++) //将position位置之后的数组数据往前移动一个位置 { slt->a[i] = slt->a[i+1]; } slt->size--; }</span>
测试main函数为:
<span style="font-size:14px;">#include <stdio.h>
#include <stdlib.h>
#include "sequlist.h"
void main(void)
{
sequence_list sqlst, *p_sqlst;
//顺序表初始化
init(&sqlst);
p_sqlst = &sqlst;
//利用在顺序表后面插入元素的方法建立一个新的顺序表
int getin;
while (scanf("%d", &getin)==1 && sqlst.size<MAXSIZE)
{
append(p_sqlst, getin);
}
display(p_sqlst); //打印输出
//可以循环查找的函数体
int search_num;
puts("输入待查找元素");
while (scanf("%d", &search_num) == 1)
{
printf("待查找元素%d的结点位置为%d\n", search_num, find(sqlst, search_num));
puts("输入待查找元素");
}
//取得顺序表中第i个结点的值
int i;
puts("输入数值i");
while(scanf("%d", &i) == 1)
{
printf("顺序表中第%d个结点的值为%d\n", i, get(sqlst, i));
puts("输入数值i");
}
//在顺序表的position位置插入值为x的结点
int position, x;
puts("输入插入位置positon和插入值x");
while(scanf("%d, %d", &position, &x) == 2)
{
insert(p_sqlst, x, position);
puts("插入结果为:");
display(p_sqlst);
puts("输入插入位置positon和插入值x");
}
//删除表中第position位置的结点
int dele_position;
puts("输入待删除结点位置position");
while (scanf("%d", &dele_position) == 1)
{
dele(p_sqlst, dele_position);
puts("删除结果为:");
display(p_sqlst);
puts("输入待删除结点位置position");
}
system("pause");
}</span>