数据结构-线性表顺序存储C语言实现

typedef int ElementType;//线性表内数据元素类型重命名为ElementType,目前是int
typedef struct SqList* List;
struct SqList {
	ElementType Data[MAXSIZE];//最大容量
	int length;//表长
};

1、初始化

//空表
List MakeEmpty() {
	List PtrL;
	PtrL = (List)malloc(sizeof(struct SqList));
	PtrL->length = 0;
	return PtrL;
}

2、插入

//插入
bool ListInsert(List PtrL, ElementType X, int i) {//在PtrL中第i个位置插入元素X
	if (PtrL->length == MAXSIZE) {//线性表已满
		return false;
	}
	if (i<1 || i>PtrL->length + 1) {//位置不对
		return false;
	}
	for (int j = PtrL->length - 1; j >= i - 1; j--) {
		PtrL->Data[j + 1] = PtrL->Data[j];
	}
	PtrL->Data[i - 1] = X;
	PtrL->length++;
	return true;
}

3、删除

//删除
bool ListDelete(List PtrL, int i) {//删除PtrL中第i个位置上的元素
	if (i<1 || i>PtrL->length) {
		return false;
	}
	for (int j = i; j < PtrL->length; j++) {
		PtrL->Data[j - 1] = PtrL->Data[j];
	}
	PtrL->length--;
	return true;
}

4、查找

4-1、按位查找

//按位查找
ElementType GetElem(List PtrL, int i) {//查找PtrL中第i个位置的元素
	return  PtrL->Data[i - 1];
}

4-2、按值查找

//按值查找
int LocateElem(List PtrL, ElementType X) {//返回下标
	int i;
	if (PtrL->length == 0) {
		return 0;
	}
	for (i = 0; i < PtrL->length; i++) {
		if (PtrL->Data[i] == X) {
			return i + 1;
		}
	}
	if (i >= PtrL->length) {
		return 0;
	}
}

5、输出

//输出
void DisList(List PtrL) {
	int i;
	for (i = 0; i < PtrL->length; i++) {
		printf("%d ", PtrL->Data[i]);
	}
	return;
}

6、完整+测试程序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 20
typedef int ElementType;//线性表内数据元素类型重命名为ElementType,目前是int
typedef struct SqList* List;
struct SqList {
	ElementType Data[MAXSIZE];//最大容量
	int length;//表长
};

//初始化
void InitList(List PtrL) {
	//PtrL = (List)malloc(sizeof(struct SqList));
	PtrL->length = 0;
	return;
}

//空表
List MakeEmpty() {
	List PtrL;
	PtrL = (List)malloc(sizeof(struct SqList));
	PtrL->length = 0;
	return PtrL;
}

//插入
bool ListInsert(List PtrL, ElementType X, int i) {//在PtrL中第i个位置插入元素X
	if (PtrL->length == MAXSIZE) {//线性表已满
		return false;
	}
	if (i<1 || i>PtrL->length + 1) {//位置不对
		return false;
	}
	for (int j = PtrL->length - 1; j >= i - 1; j--) {
		PtrL->Data[j + 1] = PtrL->Data[j];
	}
	PtrL->Data[i - 1] = X;
	PtrL->length++;
	return true;
}

//删除
bool ListDelete(List PtrL, int i) {//删除PtrL中第i个位置上的元素
	if (i<1 || i>PtrL->length) {
		return false;
	}
	for (int j = i; j < PtrL->length; j++) {
		PtrL->Data[j - 1] = PtrL->Data[j];
	}
	PtrL->length--;
	return true;
}

//输出
void DisList(List PtrL) {
	int i;
	for (i = 0; i < PtrL->length; i++) {
		printf("%d ", PtrL->Data[i]);
	}
	return;
}

//查找
//按位查找
ElementType GetElem(List PtrL, int i) {//查找PtrL中第i个位置的元素
	return  PtrL->Data[i - 1];
}

//按值查找
int LocateElem(List PtrL, ElementType X) {//返回下标
	int i;
	if (PtrL->length == 0) {
		return 0;
	}
	for (i = 0; i < PtrL->length; i++) {
		if (PtrL->Data[i] == X) {
			return i + 1;
		}
	}
	if (i >= PtrL->length) {
		return 0;
	}
}

//TEST
int main(void) {
	List L;
	L = MakeEmpty();
	int len, x, dn, gn, ln;
	printf("请输入n(n≤10):\n");
	scanf("%d", &len);
	printf("请输入对应数量的整数元素(用空格隔开):\n");
	for (int i = 1; i <= len; i++) {
		scanf("%d", &x);
		ListInsert(L, x, i);
	}
	printf("该表为:\n");
	DisList(L);
	printf("\n");
	printf("请输入要删除的元素对应的位置序号:\n");
	scanf("%d", &dn);
	int flag = ListDelete(L, dn);
	if (flag) {
		printf("成功删除第%d个元素\n", dn);
	}
	else {
		printf("删除失败\n");
	}
	DisList(L);
	printf("\n");
	printf("请输入要查找元素的位置:\n");
	scanf("%d", &gn);
	int va = GetElem(L, gn);
	printf("第%d个位置的元素值为%d\n", gn, va);
	printf("请输入要查找的元素值:\n");
	scanf("%d", &ln);
	int flag_ln = LocateElem(L, ln);
	if (flag_ln) {
		printf("%d元素的位置为%d\n", ln, flag_ln);
	}
	else {
		printf("查找失败\n");
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值