1.1线性表的顺序表示与实现

本文介绍了一种使用顺序存储结构实现线性表的方法,并提供了一系列基本操作的实现,包括初始化、查询、插入、删除等。此外,还通过一个具体示例展示了如何删除一个线性表中在另一个线性表中出现过的元素。

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

1.1线性表的顺序表示与实现

线性表的顺序存储指的是将线性表中的元素存放在一组连续的存储单元中,这样使得在逻辑上是相邻的,物理存储上也是相邻的。采用顺序存储结构的线性表称为顺序表。

顺序表反应了线性表中元素的逻辑关系,只要知道第一个元素的存储地址就能得到线性表中任何一个元素的存储地址。同样已知任何一个元素的存储地址都可以得到其他元素的存储地址。因此线性表中的任何一个元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。

问题:如果A中的元素在B中出现过,将A中的删除。

解决:

头文件

#pragma once
#include <stdio.h>
#include <stdlib.h>

#define LISTSIZE 100

typedef int DataType;

typedef struct {
	DataType list[LISTSIZE];
	int length;
}SeqList;

//顺序表初始化
void InitList(SeqList* L)
{
	L->length = 0;
}

//判断顺序表是否为空
int ListEmpty(SeqList L)
{
	if (L.length == 0)
		return 1;
	else
		return 0;
}

//获取第i个元素,用e接收
int GetElem(SeqList L, int i, DataType* e)
{
	if (i<1 || i>L.length)
		return -1;
	*e = L.list[i - 1];
	return 1;
}

//查找与e相等的元素
int LocateElem(SeqList L, DataType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (e == L.list[i])
			return i + 1;
	}
	return 0;
}

//在第i个位置插入新元素e
int InsertList(SeqList* L, int i, DataType e)
{
	if (i<1 || i>L->length + 1)
		return -1;
	else if (L->length == LISTSIZE)
		return 0;
	else
	{
		for (int j = L->length; j >= i; j--)
			L->list[j] = L->list[j - 1];
		L->list[i - 1] = e;
		L->length++;
		return 1;
	}
}

//删除第i个元素
int DeleteList(SeqList* L, int i, DataType* e)
{
	if (L->length <= 0)
		return 0;
	else if (i<1 || i>L->length)
		return -1;
	else
	{
		*e = L->list[i - 1];
		for (int j = i; j <= L->length - 1; j++)
			L->list[j - 1] = L->list[j];
		L->length--;
		return 1;
	}
}

//返回线性表的长度
int ListLength(SeqList L)
{
	return L.length;
}

//清空线性表
void ClearList(SeqList* L)
{
	L->length = 0;
}

测试文件

#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"

//删除 A在B中出现的元素
void DelElem(SeqList* A, SeqList* B);

void main()
{
	SeqList A, B;
	int i, j;
	DataType e;
	InitList(&A);
	InitList(&B);
	for (int i = 1; i <=10; i++)
	{
		if (InsertList(&A, i, i) == 0)
		{
			printf("插入位置不合法");
			return;
		}
	}
	for (i = 1,j = 1;j<=6;i=i+2,j++)
	{
		if (InsertList(&B, j, 2*i) == 0)
		{
			printf("插入位置不合法");
			return;
		}
	}
	printf("顺序表A的元素:\n");
	for (i = 1; i <= A.length; i++)
	{
		if (GetElem(A, i, &e)==1)
			printf("%4d",e);
	}
	printf("\n");

	printf("顺序表B的元素:\n");
	for (i = 1; i <= B.length; i++)
	{
		if (GetElem(B, i, &e) == 1)
			printf("%4d", e);
	}

	printf("\n");
	printf("将在A中出现B的元素删除后A中的元素:\n");
	DelElem(&A, &B);
	for (i = 1; i <= A.length; i++)
	{
		if (GetElem(A, i, &e) == 1)
			printf("%4d", e);
	}
	printf("\n");
	


}

void DelElem(SeqList* A, SeqList* B) {
	int pos;
	DataType e;
	int i;
	for (i = 0; i <=B->length; i++)
	{
		if (GetElem(*B, i, &e) == 1)
		{
			pos = LocateElem(*A, e);
			if (pos > 0)
				DeleteList(A, pos, &e);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值