数据结构-顺序表(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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!