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

线性表顺序存储实现


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

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值