数据结构C语言版:线性表之顺序存储

数据结构C语言版:线性表之顺序存储

个人的学习笔记,如有不合理之处欢迎指正,谢谢!

自己写的代码(我只写了主要的插入、删除、遍历三种操作的代码,其他操作实现起来很简单我就没写)
#include<stdio.h>

#define MaxSize 10

typedef struct {
	int data[MaxSize];
	int length;
}SqList;

// 初始化顺序表
SqList* InitList(SqList* L) {
	printf("此表为顺序表,最大可容纳10个数!\n");
	L = (SqList*)malloc(sizeof(SqList));
	L->length = 0;
	int dat;
	printf("请输入你的第%d个数据(输入0结束):", L->length + 1);
	scanf("%d", &dat);
	while (dat) {
		if (FullList(L)) {
			printf("空间不足,已自动退出!\n");
			break;
		}
		L->data[L->length] = dat;
		L->length++;
		printf("请输入你的第%d个数据(输入0结束):",L->length + 1);
		scanf("%d", &dat);
	}
	return L;
}

// 插入元素
int InsertList(SqList* L, int i, int e) {
	if (FullList(L)) {
		printf("空间不足,已自动退出!\n");
		return;
	}
	if (i < 1 || i > L->length + 1) {
		printf("插入的位置有误!\n");
		return;
	}
	for (int l = L->length - 1; l > i-2; l--) {
		L->data[l + 1] = L->data[l];
	}
	L->data[i - 1] = e;
	L->length++;
	return;
}

// 删除元素
int DeleteList(SqList* L, int i) {
	if (EmptyList(L)) {
		printf("L是空表,不可删除元素!\n");
		return;
	}
	if (i < 1 || i > L->length) {
		printf("删除的位置有误!\n");
		return;
	}
	for (int l = i - 1; l < L->length -1; l++) {
		L->data[l] = L->data[l + 1];
	}
	L->length--;
}

// 判断顺序表是否为空
int EmptyList(SqList* L) {
	return L->length == 0;
}

// 判断顺序表是否为满
int FullList(SqList* L) {
	return L->length == MaxSize;
}

// 遍历顺序表
int TraverseList(SqList* L) {
	if (EmptyList(L)) {
		printf("L是空表,不需要遍历!\n");
		return;
	}
	for (int i = 0; i < L->length; i++) {
		printf("%d ", L->data[i]);
	}
	putchar('\n');
}

int main() {
	SqList* L = NULL;
	int select, i, e;
	L = InitList(L);
	while (1) {
		printf("1、插入元素 2、删除元素 3、遍历输出 4、退出程序\n");
		printf("请输入你要进行的操作:");
		scanf("%d", &select);
		if (select == 1) {
			printf("请输入你要插入的位置:");
			scanf("%d", &i);
			printf("请输入你要插入的元素:");
			scanf("%d", &e);
			InsertList(L, i, e);
		}
		else if (select == 2) {
			printf("请输入你要删除的位置:");
			scanf("%d", &i);
			DeleteList(L, i);
		}
		else if (select == 3) {
			TraverseList(L);
		}
		else {
			break;
		}
	}
}

代码其二

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

// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2 // 溢出时使用
#define MAXSIZE 100

// Status是函数的类型,其值是函数结果的状态代码
typedef int Status;
typedef char ElemType;

typedef struct {
	ElemType *elem; // 定义指针(数组)类型变量
	int length;
}SqList;

// 线性表L的初始化(参数用引用类型,未使用指针)
Status InitList(SqList &L) {
	// 使用new关键字为指针动态分配空间
//	L.elem = new ElemType[MAXSIZE];
	// 也可以这样
	L.elem = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
	if (!L.elem) { // 存储空间分配失败
		exit(OVERFLOW); // 函数头文件在stdlib.h里面
	}
	L.length = 0;
	return OK;
}

// 1.销毁线性表
void DestroyList(SqList &L) {
	if (L.elem) {
		delete L.elem; // 使用delete关键字(参数为指针)释放存储空间
		printf("线性表已销毁!程序已退出!\n");
	}
}

// 2.清空线性表
void ClearList(SqList &L) {
	L.length = 0; // 将线性表长度设置为0
	printf("线性表已清空!\n");
}

// 3.求线性表的长度
int GetLength(SqList L) {
	return L.length; // 返回线性表的长度
}

// 4.判断线性表是否为空
int IsEmpty(SqList L) {
	if (L.length == 0) {
		printf("线性表为空!\n");
		return 1;
	}
	else {
		printf("线性表不为空!\n");
		return 0;
	}
}

// 5.顺序表的取值
int GetElem(SqList L, int i, ElemType &e) {
	if (i < 1 || i > L.length) { // 判断i值是否合理
		printf("下标越界!\n");
		return ERROR;
	}
	e = L.elem[i - 1];
	printf("取值成功!\n");
	return OK;
}

//6.顺序表的查找
int LocateElem(SqList L, ElemType e) {
	// 在线性表中查找值为e的数据元素,返回其序号
	for (int i = 0; i < L.length; i++) {
		if (e == L.elem[i]) {
			printf("查找成功!\n");
			return i + 1; // 查找成功
		}
	}
	printf("查找失败!\n");
	return 0; // 查找失败,返回0
}

// 7.顺序表的插入
Status ListInsert(SqList &L, int i, ElemType e) {
	if (i<1 || i>L.length + 1) {
		printf("下标越界!\n");
		return ERROR; // i值不合法
	}
	if (L.length == MAXSIZE) {
		printf("当前存储空间已满!\n");
		return ERROR;// 当前存储空间已满
	}
	for (int j = L.length - 1; j >= i - 1; j--) {
		// 插入位置以及之后的元素后移
		L.elem[j + 1] = L.elem[j];
	}
	// 赋值
	L.elem[i - 1] = e;
	// 表长加1
	L.length++;
	printf("插入元素成功!\n");
	return OK;
}

// 8.顺序表的删除
Status ListDelete(SqList &L, int i) {
	if (i < 1 || i > L.length) {
		printf("下标越界!\n");
		return ERROR;
	}
	for (int j = i; j <= L.length - 1; j++) {
		L.elem[j - 1] = L.elem[j];
	}
	L.length--;
	printf("删除元素成功!\n");
	return OK;
}

// 9.遍历输出
void ListTraverse(SqList &L) {
	printf("线性表的元素值为:\n");
	for (int i = 0; i < L.length; i++) {
		printf("%c ",L.elem[i]);
	}
	putchar('\n');
}

// 主函数
void main() {
	SqList L;
	InitList(L);
	int i = 0, signal;
	ElemType data;
	printf("请输入线性表的初始元素,输入enter表示输入结束:\n");
	scanf("%c",&data);
	while (data != '\n') {
		if (data != ' ') {
			L.elem[i++] = data;
			L.length++;
		}
		scanf("%c", &data);
	}
	while (1) {
		printf("---------------------------------\n");
		printf("+  1.DestroyList   2.ClearList  +\n");
		printf("+  3.GetLength     4.IsEmpty    +\n");
		printf("+  5.GetElem       6.LocateElem +\n");
		printf("+  7.ListInsert    8.ListDelete +\n");
		printf("+  9.ListTraverse  10.End       +\n");
		printf("---------------------------------\n");
		printf("请输入您要进行的操作:");	
		scanf("%d",&signal);
		if (signal == 1) {
			DestroyList(L);
			break; // 销毁后自动退出
		}
		if (signal == 2) {
			ClearList(L);
		}
		if (signal == 3) {
			printf("线性表的长度为:%d\n", GetLength(L));
		}
		if (signal == 4) {
			IsEmpty(L);
		}
		if (signal == 5) {
			ElemType e;
			printf("请输入要获得的元素下标:");
			scanf("%d", &i);
			if (GetElem(L, i, e) != 0) {
				printf("%d位置上的元素值为:%c\n", i, e);
			}
		}
		if (signal == 6) {
			ElemType e;
			printf("请输入要查找的元素:");
			getchar(); // 在选择6操作的时候按了回车,所以要接收回车
			scanf("%c", &e);
			getchar();
			i = LocateElem(L, e);
			if (i != 0) {
				printf("%c元素的位置为:%d\n", e, i);
			}
		}
		if (signal == 7) {
			ElemType e;
			printf("请输入要插入的元素位置和元素:");
			scanf("%d", &i);
			getchar();
			scanf("%c", &e);
			getchar();
			if (ListInsert(L, i, e) != 0) {
				printf("%d位置上的元素值为:%c\n", i, e);
			}
		}
		if (signal == 8) {
			printf("请输入要删除的元素位置:");
			scanf("%d", &i);
			ListDelete(L, i);
		}
		if (signal == 9) {
			ListTraverse(L);
		}
		if (signal == 10) {
			printf("程序已退出!\n");
			break;
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梅兮昂

你的支持是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值