线性表(顺序存储结构)C语言


前言

最近在学数据结构,想在这里记录一下,也方便以后查找

一、线行表的顺序存储结构

线性表分为两种存储结构,顺序存储与链式存储。
顺序存储就是用一维数组来实现的。一维数组的下标与元素在线性表中的序号对应。

二、代码

1.引用头文件与宏定义:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define OK   1
#define ERROR  0
#define TRUE 1
#define FALSE 0

#define	MAXSIZE  100
typedef int ElemType;

2.对线性表的定义:

typedef  struct
{
	ElemType  elem[MAXSIZE];  /*线性表占用的数组空间*/
	int       last;    /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/
}SeqList;

3.读取第i个位置上的值:

int GetElem(SeqList L, int i, ElemType *e)
{
	if (i<1 || i>L.last)
		return ERROR;
	*e = L.elem[i - 1];
	return OK;
}

4.元素e的位置:

int  Locate(SeqList L, ElemType e)
{
	int i = 0;        /*i为扫描计数器,初值为0,即从第一个元素开始比较*/
	while ((i <= L.last) && (L.elem[i] != e))		/*顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到*/
		i++;

	if (i <= L.last)
		return(i + 1);  /*若找到值为e的元素,则返回其序号*/
	else
		return(-1);  /*若没找到,则返回空序号*/
}

5.在顺序表L中第i个数据元素之前插入一个元素e。:

int  InsList(SeqList* L, int i, ElemType e)
{
	int k;
	if ((i < 1) || (i > L->last + 2)) /*首先判断插入位置是否合法*/
	{
		printf("插入位置i值不合法");
		return(ERROR);
	}
	if (L->last >= MAXSIZE - 1)
	{
		printf("表已满无法插入");
		return(ERROR);
	}
	for (k = L->last;k >= i - 1;k--)   /*为插入元素而移动位置*/
		L->elem[k + 1] = L->elem[k];
	L->elem[i - 1] = e;   /*在C语言数组中,第i个元素的下标为i-1*/
	L->last++;
	return(OK);
}

6.在顺序表L中删除第i个数据元素:

int  DelList(SeqList* L, int i, ElemType* e)
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤L.last+1 */
{
	int k;
	if ((i < 1) || (i > L->last + 1))
	{
		printf("删除位置不合法!");
		return(ERROR);
	}
	*e = L->elem[i - 1];  /* 将删除的元素存放到e所指向的变量中*/
	for (k = i; k <= L->last; k++)
		L->elem[k - 1] = L->elem[k];  /*将后面的元素依次前移*/
	L->last--;
	return(OK);
}

7.显示顺序表L中的数据元素:

void Display(SeqList L)
/*显示顺序表L中的数据元素*/
{
	int i;
	for (i = 0; i <= L.last; i++)
	{
		printf("%d  ", L.elem[i]);
	}
	printf("\n");
}

8.主函数:

void main()
{
	SeqList* l;
	int p, r, q;
	int* e;
	int i;
	l = (SeqList*)malloc(sizeof(SeqList));
	e = (int*)malloc(sizeof(int));
	printf("请输入线性表的长度:");
	scanf("%d", &r);
	l->last = r - 1;
	printf("请输入线性表的各元素值:\n");
	for (i = 0; i <= l->last; i++)
	{
		scanf("%d", &l->elem[i]);
	}
	/*在顺序表中查找*/
	printf("请输入要查找的元素值:\n");
	scanf("%d", &q);
	p = Locate(*l, q);
	if (p == -1)
		printf("在此线性表中没有该元素!\n");
	else
		printf("该元素在线性表中的位置为:%d\n", p);
	/*顺序表的插入操作*/
	printf("请输入要插入的位置:\n");
	scanf("%d", &p);
	printf("请输入要插入的元素值:\n");
	scanf("%d", &q);
	InsList(l, p, q);
	printf("插入后的顺序表为:");
	Display(*l);

	/*顺序表的删除操作*/
	printf("请输入要删除的元素位置:\n");
	scanf("%d", &p);
	DelList(l, p, e);
	printf("删除后的顺序表为:");
	Display(*l);
	printf("删除的元素值为:%d\n", *e);
}

三、运行结果

在这里插入图片描述

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹹魚不鹹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值