学习数据结构笔记--顺序表的数组实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luolan_hust/article/details/68495644

#include <iostream>
#include <stdio.h>
using namespace std;


//****对于一个线性表,通常需要实现的操作有:新建一个空表、销毁一个表,清空一个表,判断是否为空
//****获得表的长度,查找指定位置的元素值、查找指定元素的位置、返回前驱元素,返回后继元素
//****插入、删除、排序、逆序、遍历一遍
//****复杂操作:两个表合并成为一个表,一个表拆开成两个表,复制一个线性表

//1. 定义一个线性表中的顺序表,用一维数组实现,一维数组是顺序存储的,使用动态数组实现表的长度可以增加的特性
const int LIST_INIT_SIZE = 100; //初始分配的数组
const int LIST_INCREMENT = 10; //数组大小的增量


struct Sqlist
{
int *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
};


bool ListInit(Sqlist&list)
{
list.length = 0;//建立一个空表
list.listsize = LIST_INIT_SIZE;
list.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if (!list.elem)
{
printf("内存分配失败!");
return false;
}
else
{
return true;
}
}

bool IsEmpty(Sqlist&list)
{
//判断是否为空表
if (list.length==0)
{
return true;
}
else
{
return false;
}
}


void DestroyList(Sqlist&list)
{
list.length = 0;//销毁一个表
list.listsize = 0;
if (list.elem!=NULL)
{
free(list.elem);
list.elem = NULL;
printf("此表已经销毁!");
}
}


void ClearList(Sqlist&list)
{
if (!IsEmpty(list))//清空一个表
{
list.length = 0;
}
else
{
printf("当前是一个空表,不需要清空!");
return;
}
}


void PrintList(Sqlist&list)
{
//打印一个表
if (!IsEmpty(list))
{
for (int i = 0; i < list.length;i++)
{
printf("%d ", list.elem[i]);
}
}
else
{
printf("当前是一个空表,无法打印内容!");
}
}


int GetListlength(Sqlist&list)
{
return list.length;//求表的长度
}


int GetEnum(Sqlist&list, int i)
{
//按位置查找某个元素
if (i<0 || i>list.length-1)
{
printf("输入的元素位置越界,找不到对应的元素!");
return -1;
}
else
{
return list.elem[i];
}
}




int GetLocate(Sqlist&list, int e)
{
//按元素查找位置
for (int i = 0; i < list.length; i++)
{
if (list.elem[i]==e)
{
return i;
}
}
return -1;
}




int PreElem(Sqlist&list, int e)
{
for (int i = 0; i < list.length; i++)
{
if (list.elem[i]==e)
{
if (i==0)
{
printf("当前是第一个元素,没有前驱!");
return -1;//表示这是第一个元素,没有前驱
}
else
{
return (list.elem[i-1]);//表示找到了前驱
}
}
}
return -2;//表示没有找到前驱
}


int NextElem(Sqlist&list, int e)
{
for (int i = 0; i < list.length; i++)
{
if (list.elem[i] == e)
{
if (i == list.length-1)
{
printf("当前是最后一个元素,没有后继!");
return -1;//表示这是最后一个元素,没有后继
}
else
{
return (list.elem[i +1]);//表示找到了后继
}
}
}
return -2;//表示没有找到后继
}


bool ListInsert(Sqlist&list, int i, int e)
{
//首先判断插入位置是否合理
if (i<0 || i> list.length-1)
{
printf("插入位置不合理!");
return false;//插入失败
}
//如果分配空间已经满了,重新分配内存
if (list.listsize==list.length)
{
list.listsize = LIST_INIT_SIZE + LIST_INCREMENT;
list.elem = (int *)realloc(list.elem, list.listsize*sizeof(int));
if (list.elem==NULL)
{
printf("内存分配失败!");
return false;
}
}
//执行插入过程
for (int j = list.length; j > i; j--)
{
list.elem[j] = list.elem[j - 1];
}
list.elem[i] = e;
list.length++;
return true;
}


bool ListDelete(Sqlist&list, int i)
{
//判断删除位置是否合理
if (i<0 || i>list.length-1)
{
printf("删除元素位置越界!");
return false;
}
//执行删除过程
for (int j = i; j < list.length - 1;j++)
{
list.elem[j] = list.elem[j + 1];
}
list.length--;
return true;
}


//主函数中测试该顺序表
bool meau(Sqlist &L)
{
int i;
int e;
int a;
int b;
system("cls");
printf("*******************************\n");
printf("0,创建顺序表\n");
printf("1---显示顺序表\n");
printf("2---插 入元素\n");
printf("3---按位置删除\n");
printf("4---按位置查找\n");
printf("5---按值查找\n");
printf("6---清除顺序表\n");
printf("7---销毁顺序表\n");
printf("8---退出\n");
printf("*******************************\n");
scanf_s("%d", &i);
switch (i){
case 0:
int j;
printf("请输入线性表元素个数");
scanf_s("%d", &j);
if (j > LIST_INIT_SIZE){
printf("内存不足!!");
exit(0);
}
ListInit(L);
printf("请输入顺序表的元素:");
for (int k = 0; k< j; k++)
{
scanf_s("%d", &L.elem[k]);
L.length++;
}
system("pause");
meau(L);
case 1:
PrintList(L);
system("pause");
meau(L);
case 2:
printf("输入插入的位置与元素,用空格隔开\n");
int index;
scanf_s("%d %d", &index, &e);//输入时注意是空格还是逗号
ListInsert(L, index, e);
PrintList(L);
system("pause");
meau(L);
case 3:
printf("请输入要删除的位置:");
scanf_s("%d", &index);
ListDelete(L, index);
PrintList(L);
system("pause");
meau(L);
case 4:
printf("请输入要查找的元素位置:");
scanf_s("%d", &e);
a = GetEnum(L, e);
printf("查找的元素值是: %d", a);
system("pause");
meau(L);
case 5:
printf("请输入要返回的值的位置:");
scanf_s("%d", &index);
b = GetLocate(L, index);
printf("查找的元素位置是: %d", b);
system("pause");
meau(L);
case 6:
ClearList(L);
PrintList(L);
system("pause");
meau(L);
case 7:
DestroyList(L);
PrintList(L);
system("pause");
meau(L);
case 8:
exit(0);
}
return 1;
}


void main()
{
Sqlist L;
meau(L);

}

//ps:自己学习时写的,以上如有错误,请联系我修改,谢谢大家!

猜你喜欢

转载自blog.csdn.net/luolan_hust/article/details/68495644
今日推荐