线性表顺序存储方式实现

线性表顺序存储方式实现


0. 定义线性表顺序存储结构

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;

typedef struct SeqList{
	int elem[MAXSIZE];
	int length;
}SeqList;

1. 初始化线性表

// 初始化操作 建立一个空的线性表 list 
Status Init(SeqList* list)
{
	list->length = 0;
	return OK;
}

2. 判断线性表是否为空

// 若线性表为空 返回 TRUE, 否则返回 FALSE 
Status ListEmpty(SeqList list)
{
	
	if (list.length == 0)
		return TRUE;
	else
		return FALSE;
}

3. 清空线性表

// 将线性表清空
Status ClearList(SeqList* list)
{
	//for (int i = 0;i < list->length;i++)
	//{
	//	list->elem[i] = 0;
	//}
	list->length = 0;
	return OK;
}

4. 获取线性表中指定位置的元素

// 将线性表 list 中第 i 个元素返回给 e
Status getElem(SeqList list, int i, int* e)
{
	// if (i < 1 || i > length)
	if (list.length == 0 || i < 1 || i > list.length)
		return ERROR;
	*e = list.elem[i-1];
	return OK;
}

5. 定位给定元素在线性表中的位置

// 在线性表 list 中查找与 给定元素 e 相等的元素,如果查找成功返回该元素在表中序号表示成功
// 返回 0 表示失败
int LocateElem(SeqList list, int e)
{	int i;
	if (list.length == 0)
		return 0;
	for (i = 0;i < list.length;i++)
	{
		if (list.elem[i] == e)
			break;
	}
	if (i >= list.length)
		return 0;
	return i+1;
}  

6. 在线性表指定位置插入元素

// 在线性表 list 的第 i 个位置插入新元素 e
Status ListInsert(SeqList* list, int i,int e)
{
	if (i >list->length+1 || i < 1 || list->length == MAXSIZE)
		return ERROR;
	for(int pos = list->length; pos >= i; pos--)
	{
		list->elem[pos] = list->elem[pos-1];
	}
	list->elem[i-1] = e;
	
	// ***
	list->length +=1;
	return OK;
} 

7. 删除线性表指定位置的元素

// 删除线性表 list 中第 i 个位置元素,并用 e 返回其值
Status ListDelete(SeqList* list, int i, int* e)
{
 	if (i < 1 || i > list->length || list->length == 0)
 		return ERROR;
 	*e = list->elem[i-1];
 	for (int pos = i-1;pos < list->length-1;pos++)
 	{
 		list->elem[pos] = list->elem[pos+1];
 		
	}
	list->length -= 1;
	return OK;
}

8. 求两个线性表的并集

// 删除线性表 list 中第 i 个位置元素,并用 e 返回其值
Status ListDelete(SeqList* list, int i, int* e)
{
 	if (i < 1 || i > list->length || list->length == 0)
 		return ERROR;
 	*e = list->elem[i-1];
 	for (int pos = i-1;pos < list->length-1;pos++)
 	{
 		list->elem[pos] = list->elem[pos+1];
 		
	}
	list->length -= 1;
	return OK;
}

9. 案例测试

int main(void)
{
	SeqList list;
	Status status;
	status = Init(&list);
	printf("初始化 list 后:list.length = %d\n",list.length);
	
	// 插入 5 个元素
	for(int i = 1;i <= 5;i++)
		status = ListInsert(&list,i,i);
	Display(list);
	
	// 删掉 第 4 个元素
	int tempValue;
	status =  ListDelete(&list,3,&tempValue);
	Display(list);
	
	// 获取第 2 个元素
	status = getElem(list,2,&tempValue);
	printf("%d\n",tempValue); 
	
	// 查找元素 4 在 list 中的位置
	tempValue = LocateElem(list,11);
	printf("*********************************\n"); 
	
	SeqList list2;
	status = Init(&list2);
	
	// 插入 8 个元素
	for(int i = 1;i <= 8;i++)
		status = ListInsert(&list2,i,i+5);
	UnionList(&list,list2);
	Display(list);
	
	return 0;
}
  • 0
    点赞
  • 11
    收藏
  • 打赏
    打赏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

annjeff

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值