数据结构之顺序表的简单实践操作
1.操作
2.运行结果
3.总结
即(初始化,创建,取值,查找,插入,删除)
实践代码如下:
#include<stdio.h>
#include<stdlib.h>
//顺序表
//顺序表的定义
typedef int ElemType;
typedef struct {
ElemType *elem;//顺序表的基地址
int length;//顺序表的长度
}SqList; //别名 如果没有typedef关键字,则每次定义一个新变量的时候要用struct 类型名
#define MaxSize 20 //宏定义MaxSize,不能写成MaxSize=20
//1.初始化 initList(SqList &L) &表示引用,才可修改顺序表的值
//2.创建 CreateList(SqList &L)
//3.取值 GetElem(SqList L,int i,int &e)
//4.查找 LocateElem(SqList L,int e)
//5.插入 ListInsert_Sq(SqList &L,int i,int e)
//6.删除 ListDelete_Sq(SqList &L,int i,int &e)
//声明函数(互相调用的函数位置可以任意
bool initList(SqList &L);
bool CreateList(SqList &L);
bool GetElem(SqList L, int i, int &e);
int LocateElem(SqList L, int e);
bool ListInsert_Sq(SqList &L, int i, int e);
bool ListDelete_Sq(SqList &L, int i, int &e);
//具体实现每一个函数
bool initList(SqList &L) {
L.elem = new int[MaxSize];
if (!L.elem)
return false;
L.length = 0;
return true;
}
bool CreateList(SqList &L) {
int i=0, v;
scanf_s("%d", &v);
while (v != -1) {
//顺序表满异常处理
if (L.length == MaxSize)
return false;
L.elem[i++] = v;
L.length++;
scanf_s("%d", &v);
}
return true;
}
bool GetElem(SqList L, int i, int &e) {
if (i<1 || i>L.length)//超出范围取值异常
return false;
e = L.elem[i - 1];
return true;
}
int LocateElem(SqList L, int e) {
for (int i = 0; i < L.length; i++)
if (e == L.elem[i])
return i + 1;
return -1;//不存在返回-1
}
bool ListInsert_Sq(SqList &L, int i, int e) {
if (i<1 || i>L.length + 1)//超出异常范围处理
return false;
for (int j = L.length - 1; j >= i - 1; j–) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
L.length++;
return true;
}
bool ListDelete_Sq(SqList &L, int i, int &e) {
if (i<1 || i>L.length)
return false;
e = L.elem[i - 1];
for (int j = i - 1; j < L.length - 1; j++) {
L.elem[j] = L.elem[j + 1];
}
L.length–;
return true;
}
void represent() {
printf(“选择顺序表的功能如下:\n”);
printf(“1.顺序表的创建\n”);
printf(“2.顺序表的取值\n”);
printf(“3.顺序表的值的下标\n”);
printf(“4.顺序表值的插入\n”);
printf(“5.顺序表值的删除\n”);
}
//打印顺序表
void print(SqList L) {
printf(“顺序表为:”);
if (L.length == 0) {//如果为空
printf(“null\n\n”);
return;
}
for (int i = 0; i < L.length; i++) {
printf("%d “, L.elem[i]);
}
printf(”\n\n");
}
void main() {
SqList L;
initList(L);
bool flag = true;//表示只能创建一次,除非删除空了
int c=0;
while (true) {
c = 0;
represent();//代表显示选择功能函数
printf(“请选择第几个功能:”);
scanf_s("%d", &c);
//system(“cls”);
if (c == 1 && flag) {
if(CreateList(L))
printf(“创建成功\n”);
flag = false;//避免第一次创建的没有删除完又创建
}
else if (c == 1 && !flag) {
printf(“已经创建,不能再创建!\n”);
}
else if (c == 2) {
int e=0;
int loc;
printf(“请输入获取第几个元素:”);
scanf_s("%d", &loc);
if(GetElem(L, loc,e))
printf(“获得的第%d个元素是:%d\n”, loc, e);
}
else if (c == 3) {
printf(“请输入要寻找位置的元素:”);
int e;
scanf_s("%d", &e);
if (LocateElem(L, e) != -1) {
printf(“元素%d在顺序表的第%d个位置\n”, e, LocateElem(L, e));
}
else {
printf(“顺序表不存在此元素\n”);
}
}
else if (c == 4) {
int e,loc;
printf(“请输入要插入的元素:”);
scanf_s("%d", &e);
printf(“请输入要插入的位置:”);
scanf_s("%d", &loc);
if (ListInsert_Sq(L, loc, e))
printf(“第%d位置插入%d成功!\n”, loc, e);
}
else if (c == 5) {
int loc,e=0;
printf(“请输入要删除的位置:”);
scanf_s("%d", &loc);
if(ListDelete_Sq(L, loc, e))
printf(“删除的第%d位置的元素为%d\n”, loc,e);
if(L.length==0) {
flag = true;//删除完毕,可以继续创建顺序表了
}
}
else if (c == -1)//退出操作
{
printf(“退出顺序表的操作!\n”);
break;
}
print(L);//每次操作后显示顺序表的数据
}
system(“pause”);//暂停操作
}
运行结果:
总结:顺序表多用于很少插入和删除线性表中,其时间复杂度为O(n),下节我们将展示链表之单链表的操作,本文有错之处望大家多多指正。
有问题可以联系本人qq:1359266354(吴先生)