数据结构---顺序表基本操作的实现

目录

今日学习:

1.顺序表的定义。

2.顺序表的初始化。

3.顺序表的输入。

4.顺序表的输出。

5.顺序表的查找。

6.顺序表的插入。

7.顺序表的删除。

8.顺序表的合并。

9.函数的调用。

10.源代码。


今日学习:

1.顺序表的定义。

typedef struct
{
	ElemType elem[MAXSIZE];
	int length;
	int listsize;
}SqList;//定义一个静态顺序表

2.顺序表的初始化。

Status InitList_Sq(SqList& L) {
	for (int i = 0; i < MAXSIZE; i++)
		L.length = 0;//当前线性表为空表,长度为0
	printf("一个空的线性表已经构建成功\n");//输出空线性表构建成功的提示消息
	return OK;
}

3.顺序表的输入。

void InputList_Sq(SqList& L) {
	int n;
	printf("请输入顺序表长度:");
	scanf_s("%d", &n);
	L.length = n;
	if (n > MAXSIZE)
	{
		printf("数组长度不合法!");
	}
	else
	{
		printf("请输入%d个元素:\n", n);
		for (int i = 0; i < L.length; i++)
		{
			printf("第%d个元素为:", i);
			scanf_s("%d", &L.elem[i]);
		}
	}
}

4.顺序表的输出。

void Output_Sq(SqList& L) {
	printf("当前顺序表的元素依次是:");
	for (int i = 0; i < L.length; i++)
		printf("%d\t", L.elem[i]);
	printf("\n");
}

5.顺序表的查找。

int LocateElem_Sq(SqList L, ElemType e) {
	int i;
	printf("请输入需要查找的值:");
	scanf_s("%d", &e);
	for (i = 0; i < L.length; i++)//i为下标序号
	{
		if (L.elem[i] == e)
		{
			printf("该值对应的位置为%d\n", i + 1);
		}
	}
	return 0;
}

6.顺序表的插入。

Status ListInsert_Sq(SqList& L, int a, ElemType b) {

	printf("请输入需要插入的位置:");
	scanf_s("%d", &a);
	printf("请输入需要插入的数值:");
	scanf_s("%d", &b);
	if (a<1 || a>L.length + 1)//插入位置不合法
		return ERROR;
	if (L.length == MAXSIZE)//数组空间已满
		return ERROR;
	int j;
	for (j = L.length - 1; j >= a - 1; j--)
		L.elem[j + 1] = L.elem[j];//插入位置及之后元素后移
	L.elem[a - 1] = b;//新插入元素e存到i-1
	++L.length;//表长加1
	printf("元素插入成功!\n");
	return OK;
}

7.顺序表的删除。

Status ListDelete_Sq(SqList& L, int i, ElemType e) {
	printf("请输入需要删除的元素位置:");
	scanf_s("%d", &i);
	if (i<1 || i>L.length + 1)//判断元素下标是否越界
		return  FALSE;
	if (!L.elem)
	{
		printf("空表\n");
		return FALSE;
	}
	int j;
	e = L.elem[i-1];//删除元素存入e
	for (j = i ; j <= L.length; j++)
		L.elem[j - 1] = L.elem[j];
	L.length--;
	printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
	printf("删除成功!\n");
	return OK;
}

8.顺序表的合并。

Status MergeList_Sq(SqList& La, SqList& Lb, SqList& Lc) {
	//已知顺序线性表La和Lb的元素按值非递减排列
		//归并La,Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
	int i = 0, j = 0, k = 0;
	Lc.length = k;
	while ((i < La.length) && (j < Lb.length))
	{
		if (La.elem[i] > Lb.elem[j])
		{
			Lc.elem[k++] = Lb.elem[j++];
			Lc.length++;
		}
		else {
			Lc.elem[k++] = La.elem[i++];
			Lc.length++;
		}
	}
	while ((i < La.length) && (j >= Lb.length))
	{
		Lc.elem[k++] = La.elem[i++];
		Lc.length++;
	}
	while ((i >= La.length) && (j < Lb.length))
	{
		Lc.elem[k++] = Lb.elem[j++];
		Lc.length++;
	}
	Output_Sq(Lc);
	return 0;
}

9.函数的调用。

int main(void) {

	SqList L;
	SqList La;
	SqList Lb;
	SqList Lc;
	int command;
	int e = NULL;
	int i = NULL;
	int a = NULL;
	int b = NULL;
	do {
		menu();
		printf("请选择:");
		scanf_s("%d", &command);
		switch (command)
		{
		case 1:InputList_Sq(L); break;
		case 2:
			Output_Sq(L); break;
		case 3:
			LocateElem_Sq(L, e); break;
		case 4:
			ListInsert_Sq(L, a, b); break;
		case 5:
			InputList_Sq(La); InputList_Sq(Lb);
			MergeList_Sq(La, Lb, Lc); break;
		case 6:
			ListDelete_Sq(L, i, e); break;
		}
	} while (command);
	return 0;
}

10.源代码。

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct
{
	ElemType elem[MAXSIZE];
	int length;
	int listsize;
}SqList;//定义一个静态顺序表
Status InitList_Sq(SqList& L);//初始化
void InputList_Sq(SqList& L);//输入
void Output_Sq(SqList& L);//输出
int LocateElem_Sq(SqList L, ElemType e);//查找
Status ListInsert_Sq(SqList& L, int i, ElemType e);//插入
Status ListDelete_Sq(SqList& L, int i, ElemType e);//删除
Status MergeList_Sq(SqList& La, SqList& Lb, SqList& Lc);//合并
void menu();
//主菜单函数
void menu()
{
		printf("\t\t顺序表基本操作的实现\n");
		printf("\t\t==============================\n");
		printf("\t\t*请选操作          *\n");
		printf("\t\t*1.输入            *\n");
		printf("\t\t*2.输出            *\n");
		printf("\t\t*3.查找            *\n");
		printf("\t\t*4.插入            *\n");
		printf("\t\t*5.合并            *\n");
		printf("\t\t*6.删除            *\n");
		printf("\t\t==============================\n");
}
//main函数
int main(void) {

	SqList L;
	SqList La;
	SqList Lb;
	SqList Lc;
	int command;
	int e = NULL;
	int i = NULL;
	int a = NULL;
	int b = NULL;
	do {
		menu();
		printf("请选择:");
		scanf_s("%d", &command);
		switch (command)
		{
		case 1:InputList_Sq(L); break;
		case 2:
			Output_Sq(L); break;
		case 3:
			LocateElem_Sq(L, e); break;
		case 4:
			ListInsert_Sq(L, a, b); break;
		case 5:
			InputList_Sq(La); InputList_Sq(Lb);
			MergeList_Sq(La, Lb, Lc); break;
		case 6:
			ListDelete_Sq(L, i, e); break;
		}
	} while (command);
	return 0;
}
//初始化
Status InitList_Sq(SqList& L) {
	for (int i = 0; i < MAXSIZE; i++)
		L.length = 0;//当前线性表为空表,长度为0
	printf("一个空的线性表已经构建成功\n");//输出空线性表构建成功的提示消息
	return OK;
}
//输入
void InputList_Sq(SqList& L) {
	int n;
	printf("请输入顺序表长度:");
	scanf_s("%d", &n);
	L.length = n;
	if (n > MAXSIZE)
	{
		printf("数组长度不合法!");
	}
	else
	{
		printf("请输入%d个元素:\n", n);
		for (int i = 0; i < L.length; i++)
		{
			printf("第%d个元素为:", i);
			scanf_s("%d", &L.elem[i]);
		}
	}
}
//输出
void Output_Sq(SqList& L) {
	printf("当前顺序表的元素依次是:");
	for (int i = 0; i < L.length; i++)
		printf("%d\t", L.elem[i]);
	printf("\n");
}
//查找
int LocateElem_Sq(SqList L, ElemType e) {
	int i;
	printf("请输入需要查找的值:");
	scanf_s("%d", &e);
	for (i = 0; i < L.length; i++)//i为下标序号
	{
		if (L.elem[i] == e)
		{
			printf("该值对应的位置为%d\n", i + 1);
		}
	}
	return 0;
}
//插入
Status ListInsert_Sq(SqList& L, int a, ElemType b) {

	printf("请输入需要插入的位置:");
	scanf_s("%d", &a);
	printf("请输入需要插入的数值:");
	scanf_s("%d", &b);
	if (a<1 || a>L.length + 1)//插入位置不合法
		return ERROR;
	if (L.length == MAXSIZE)//数组空间已满
		return ERROR;
	int j;
	for (j = L.length - 1; j >= a - 1; j--)
		L.elem[j + 1] = L.elem[j];//插入位置及之后元素后移
	L.elem[a - 1] = b;//新插入元素e存到i-1
	++L.length;//表长加1
	printf("元素插入成功!\n");
	return OK;
}
//删除
Status ListDelete_Sq(SqList& L, int i, ElemType e) {
	printf("请输入需要删除的元素位置:");
	scanf_s("%d", &i);
	if (i<1 || i>L.length + 1)//判断元素下标是否越界
		return  FALSE;
	if (!L.elem)
	{
		printf("空表\n");
		return FALSE;
	}
	int j;
	e = L.elem[i-1];//删除元素存入e
	for (j = i ; j <= L.length; j++)
		L.elem[j - 1] = L.elem[j];
	L.length--;
	printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
	printf("删除成功!\n");
	return OK;
}
Status MergeList_Sq(SqList& La, SqList& Lb, SqList& Lc) {
	//已知顺序线性表La和Lb的元素按值非递减排列
		//归并La,Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
	int i = 0, j = 0, k = 0;
	Lc.length = k;
	while ((i < La.length) && (j < Lb.length))
	{
		if (La.elem[i] > Lb.elem[j])
		{
			Lc.elem[k++] = Lb.elem[j++];
			Lc.length++;
		}
		else {
			Lc.elem[k++] = La.elem[i++];
			Lc.length++;
		}
	}
	while ((i < La.length) && (j >= Lb.length))
	{
		Lc.elem[k++] = La.elem[i++];
		Lc.length++;
	}
	while ((i >= La.length) && (j < Lb.length))
	{
		Lc.elem[k++] = Lb.elem[j++];
		Lc.length++;
	}
	Output_Sq(Lc);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

万能的憨憨^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值