顺序表(顺序存储结构)

本文详细介绍了顺序表的基本操作,包括初始化、插入、删除、查找等,并提供了具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序存储结构会申请一段连续的内存空间来存储数据,下面详解一下顺序表的各大使用

在此之前必须要了解一个知识点:当传参的时候,如果你需要改变这个参数的数值,则需要传递这个参数变量的地址,当你不需要改变它的数值的时候,只需要传递该参数就行,这个对于非常学习数据结构十分重要。

相关的头文件定义:

#include "stdio.h"    

#include "stdlib.h"  
#include "math.h"  
#include "time.h"

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

#define MAXSIZE 20          /* 存储空间初始分配量 */

首先顺序表的定义,仅仅只需要该表的长度和分配数组大小,这个类似于结构体

typedef int ElemType;      /* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
{
	ElemType data[MAXSIZE];
	int length; 
}SqList;
typedef int Status;      //定义函数的类型 

顺序表的初始化(将长度赋值为0)

/* 初始化顺序线性表 */
Status InitList(SqList *L) 
{ 
    L->length=0;
    return OK;
}

插入数据:插入的位置可以在头,身,尾三个地方,所以要进行判断,当插入到尾部的时候,直接将该数值赋值给data[i-1]便可以,但如果是身或者头,则需要将该插入元素的后面元素依次往后移一位,最后记得将表长+1;

Status ListInsert(SqList *L,int i,ElemType e)   //i---插入的位置    e----插入的元素 
{ 
	int k;
	if(L->length == MAXSIZE)
	return ERROR;
	if(i<1||i>L->length+1)
	return ERROR;
	if(i<=L->length)
	{
		for(k = L->length-1;k>=i-1;k--)
		{
			L->data[k+1] = L->data[k];
		}
	}
	L->data[i-1] = e;
	L->length++; 
	return OK;
}

删除元素(删除元素实则就是删除元素后,将删除元素后面的元素依次往前移动一位,或者将删除元素前面元素后移一位),因为删除了L表里面的数据(改变了表的数据,则需要传递表的地址)

Status deleteList(SqList *L,int s,ElemType *e)     //s---位置 
{
	int i;
	if(s>L->length||s<1)
	return 0;
	*e = L->data[s-1];    //记录删除的元素 
	if(s<L->length)
	{
		for(i = s;i<L->length;i++)
		{
			L->data[i-1] = L->data[i];		
		}
	}
	L->length--;
	return OK;
} 

当你要删除表尾元素的时候,不需要进行驯悍操作,因为,当表长减1的时候,这个最后一位元素自然会消失,完全不用理会这种情况,只需要考虑当该位置位于表头或者表身的时候的删除情况。

查找元素位置(思路:for循环+判相等)

int findList(SqList L,ElemType e)
{
	int i;
	if(L.length == 0)
	return 0;
	for(i = 0;i<L.length;i++)
	{
		if(L.data[i] == e)
		break;
	}
	return i+1;
}

判断表是否为空

Status Listempty(SqList L)
{
	if(L.length == 0)
		return TRUE; 
	else
		return FALSE;
}

求表长

int ListLength(SqList L)
{
	int i = 0;
	while(L.length)
	{
		++i;
		L.length--;
	}
	return i;
}

合并顺序表

void unionL(SqList *La,SqList Lb)
{
	int La_len,Lb_len,i;
	ElemType e;                        /*声明与La和Lb相同的数据元素e*/
	La_len=ListLength(*La);            /*求线性表的长度 */
	Lb_len=ListLength(Lb);
	for (i=1;i<=Lb_len;i++)
	{
		getElem(Lb,i,&e);              /*取Lb中第i个数据元素赋给e*/
		if (!LocateElem(*La,e))        /*La中不存在和e相同数据元素*/
			ListInsert(La,++La_len,e); /*插入*/
	}
}
Status getElem(SqList L,int i,ElemType *e)
{
	 if(L.length==0 || i<1 || i>L.length)
            return ERROR;
     *e = L.data[i-1];
     return OK;
}
int LocateElem(SqList L,ElemType e)
{
    int i;
    if (L.length==0)
            return 0;
    for(i=0;i<L.length;i++)
    {
            if (L.data[i]==e)
                    break;
    }
    if(i>=L.length)
            return 0;

    return i+1;
}

代码运行结构如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cyrus_Ma

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

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

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

打赏作者

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

抵扣说明:

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

余额充值