您的位置:首页 > 其它

线性表学习归纳总结二:线性表顺序存储实现

2015-05-29 14:42 363 查看
线性表顺序存储实现



顺序表的存储结构
<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>


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: