数据结构-顺序表(C语言)

2023-12-13 03:40:58

1.函数的声明和自定义

list.h

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

#define MaxSize 50

typedef int ElemType;

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

#ifndef __LIST_H__
#define __LIST_H__

//菜单
void menu();

//完整法创建顺序表
void CreateList(SqList*& L, ElemType a[], int n);

//初始化表
void InitList(SqList*& L);

//摧毁表
void DestoryList(SqList*& L);

//判断表空
bool ListEmpty(SqList* L);

//获取表长
int ListLength(SqList* L);

//输出表中内容
void DispList(SqList* L);

//根据索引获取元素
bool GetElem(SqList* L, int i, ElemType& e);

//根据元素获取元素位置
int LocateElem(SqList* L, ElemType e);

//元素插入
bool ListInsert(SqList*& L, int i, ElemType e);

//元素删除
bool ListDelete(SqList*& L, int i, ElemType& e);

#endif // !__LIST_H__

2.顺序表的各函数操作

顺序表.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "list.h"

void menu() {
	printf("***************************************\n");
	printf("******1.插入              2.删除    ***\n");
	printf("******3.索引查找          4.元素查找***\n");
	printf("******5.表长              6.输出表  ***\n");
	printf("******0.退出                       ****\n");
	printf("***************************************\n");
}

//建立顺序表(这是一种整体创建顺序表,将数组a的每个元素依次放入到顺序表中)
void CreateList(SqList*& L, ElemType a[], int n) {
	int i = 0;
	int k = 0;
	L = (SqList*)malloc(sizeof(SqList));
	while (i < n) {
		L->data[k] = a[i];
		k++;
		i++;
	}
	L->length = k;
}

//初始化线性表
void InitList(SqList*& L) {
	L = (SqList*)malloc(sizeof(SqList));			//开辟一段空间
	L->length = 0;									//初始化顺序表的长度为0
}

//销毁空间
void DestoryList(SqList*& L) {
	free(L);										//释放空间
}

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

//获取顺序表长度
int ListLength(SqList* L) {
	return (L->length);								//返回顺序表长度
}

//按顺序输出顺序表内容
void DispList(SqList* L) {
	printf("表中元素有:");
	for (int i = 0; i < L->length; i++) {			//循环输出顺序表内容
		printf("%d ", L->data[i]);
	}
	printf("\n");
}

//索引查找元素
bool GetElem(SqList* L, int i, ElemType& e) {
	if (i<1 || i>L->length) {						//i<为顺序表为空,i>length为索引超出了长度,这两种情况都无法根据索引查找元素
		return false;
	}
	e = L->data[i - 1];								//根据用户输入的索引值查找到元素,因为顺序表是从零开始,所以i要-1(符合表的根据索引快速查找的特点)
	return true;
}

//根据元素值查找元素位置
int LocateElem(SqList* L, ElemType e) {
	int i = 0;
	while (i < L->length && L->data[i] != e) {		//i在小于length的范围内找到用户要查找的元素
		i++;
	}
	if (i >= L->length) {							//超出找不到就返回0,找不到该元素
		return 0;
	}
	else {
		return i + 1;								//找到用户查找的元素的i值,逻辑+1
	}
}

//顺序表插入
bool ListInsert(SqList*& L, int i, ElemType e) {	//根据要插入的元素与要插入的位置在顺序表中插入元素
	int j;
	if (i<1 || i>L->length + 1 || L->length == MaxSize) {	//要插入的位置不能小于1(逻辑上的1)也就是不能下溢、或要插入的位置不能超出长度+1(这样就不是连续的表)、或顺序表不能满
		return false;
	}
	i--;													//i--是因为存储是从0开始的
	for (j = L->length; j > i; j--) {						//j为最后一个元素,从最后一个元素往前逐个往后移一个位置,知道腾出i位置(符合表的插入删除麻烦特点)
		L->data[j] = L->data[j - 1];
	}
	L->data[i] = e;											//在i位置上插入元素
	L->length++;											//顺序表长度加一
	return true;

}

//根据索引删除顺序表中元素
bool ListDelete(SqList*& L, int i, ElemType& e) {
	int j;
	if (i<1 || i>L->length) {								//判断要删除元素的位置在顺序表内
		return false;
	}
	i--;													//逻辑-1
	e = L->data[i];											//可以用于告诉用户删除了哪个元素
	for (j = i; j < L->length; j++) {						//i位置往后的元素逐个往前移动,直接覆盖i位置的元素表示删除了
		L->data[j] = L->data[j + 1];
	}
	L->length--;											//顺序表长度-1
	return true;
}

3.运行

TEST.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "list.h"

int main() {
	SqList* L;
	ElemType e;
	int input = 0;
	int i;
	InitList(L);
	do {
		menu();
		printf("请选择模式:");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			DestoryList(L);
			break;
		case 1:
			printf("请输入要插入的元素:");
			scanf("%d", &e);
			printf("请输入要插入的位置:");
			scanf("%d", &i);
			if (ListInsert(L, i, e)) {
				printf("插入成功\n");
			}
			else {
				printf("插入失败\n");
			}
			break;
		case 2:
			printf("请输入要删除元素的位置:");
			scanf("%d", &i);
			if (ListDelete(L, i, e)) {
				printf("删除成功\n");
			}
			else {
				printf("删除成功\n");
			}
			break;
		case 3:
			printf("请输入要查找元素的位置:");
			scanf("%d", &i);
			if (GetElem(L, i, e)) {
				printf("查找成功\n");
				printf("该位置的元素为:%d\n", e);
			}
			else {
				printf("删除成功\n");
			}
			break;
		case 4:
			printf("请输入要查找的元素:");
			scanf("%d", &e);
			i = LocateElem(L, e);
			if (i == 0) {
				printf("查找失败\n");
			}
			else {
				printf("该元素的位置是:%d\n", i);
			}
			break;
		case 5:
			printf("该表的长度为:%d\n", ListLength(L));
			break;
		case 6:
			printf("该表的元素有:");
			DispList(L);
			printf("\n");
			break;
		default:
			break;
		}
	} while (input);

	return 0;
}

4.结果

插入

查找

删除

退出

文章来源:https://blog.csdn.net/qq_59614938/article/details/132726718
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。