线性表的清空是把原空间中储存的元素清空,clear
线性表的创建是把原来的空间释放了,线性表的结构不存在了,下次再想使用只能重新初始化,free的是空间,destory
#include <iostream>
#include "stdio.h"
#define LIST_INIT_SIZE 10
typedef int ElemType;//可以更改线性表元素的类型
typedef struct
{
int* elem; //指向已分配的一片连续储存空间
int lengh; //线性表中已添加的数据元素个数
int listsize;//线性表中最多能储存的数据元素个数
}SqList;
int InitList(SqList& L) //创建一个空线性表,elem有空间,无元素
{
L.elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));//申请Elem对应的内存空间用以存放线性表元素。
if (L.elem!=NULL) //判断分配空间是否成功
{
L.lengh = 0; //线性表中已添加的数据元素,初值为0
L.listsize = LIST_INIT_SIZE; //记录Elem所对应空间的大小。
printf("线性列表初始化成功!\n");
return 1;//创建成功返回1
}
else
{
return 0;
}
}
int DestoryList(SqList& L) //销毁一个线性表,释放elem内存空间
{
free(L.elem); //释放空间
L.elem = NULL;
L.lengh = 0;
L.listsize = 0;
printf("销毁成功!\n");
return 1;
}
int ClesrList(SqList& L)//清空一个线性表,但仍保留空间
{
L.lengh = 0;
printf("清空成功!\n");
return 1;
}
int ListEmpty(SqList L)//判断一个线性表是否为空表
{
if (L.lengh == 0)
return 1;//判断是空表返回1
else
return 0;
}
int ListLength(SqList& L)//获得线性表的长度,记忆保存的元素的个数
{
return L.lengh;
}
int GetElem(SqList L, int i, int& e)//获得线性表的第i个元素,把值赋值给e
{
if (i<1 || i>L.lengh)
{
return 0;//线性表中没有这个元素
}
e = L.elem[i - 1];//得到第i个元素
return 1;
}
int LocateElem(SqList L, int e) //在线性表中找到元素e在登记号位置上
{
int i;
for (i = 0; i < L.lengh; i++)
{
if (L.elem[i] == e) //遍历数组,若找到,返回具体位置
{
return i + 1;
}
}
return 0;//若未找到,返回0
}
int PriorElem(SqList L, int cur_e, int& pre_e) //获得cur_e的前一个元素,赋值给pre_e
{
int i;
for (i = 0; i < L.lengh; i++)//首先在线性表中查找cur_e
{
if (L.elem[i] == cur_e)//若找到,退出循环
{
break;
}
}
if (i == 0 || i == L.lengh)//数据不存在或无法添加
{
return 0;
}
pre_e = L.elem[i - 1];//赋值前驱元素
return 1;
}
int NextElem(SqList L, int cur_e, int& next_e) //获得cur_e的后一个元素,赋值给next_e
{
int i;
for (i = 0; i < L.lengh; i++)//首先在线性表中查找cur_e
{
if (L.elem[i] == cur_e)//若找到,退出循环
{
break;
}
}
if (i == L.lengh - 1 || i == L.lengh)//数据不存在或无法添加
{
return 0;
}
next_e = L.elem[i + 1];// 赋值后继元素
return 1;
}
int ListInsert(SqList& L, int i, int e)//在第i个元素之前插入一个元素
{
int j;
if (i<1 || i>L.lengh + 1)
{
return 0;//判断i的值是否合理
}
if (L.lengh >= L.listsize)
{
L.elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));
// 此时由于表中元素已经将Elem对应的内存空间占满,扩大该空间以容纳更多的表元素
L.listsize += LIST_INIT_SIZE;// 记录新空间的大小。
}
for (j = L.lengh; j >= i-1; j--)
{
L.elem[j+1] = L.elem[j ];//一部分元素向后移动一个位置
L.elem[i - 1] = e;//元素e插入第i号位置
L.lengh++;//线性表的长度加1
return 1;
}
}
int ListModifyElem(SqList L,int i ,int e )
{ // 将线性表中第i个的元素值修改成参数e的值。
if (i< 1 || i> L.lengh)
return 0;
L.elem[i - 1] = e;
return 1;
}
int ListDelete(SqList& L, int i, int& e)//删除第i个元素,并返回第i个元素的值
{
int j;
if (i<1 || i>L.lengh)
{
return 0;//判断i的值是否合理
}
else {
e = L.elem[i - 1];//把第i个元素的值赋给e
for (j = i; j < L.lengh; j++)
{
L.elem[j - 1] = L.elem[j];//吧第i个元素后面的元素向前移动一个位置
}
L.lengh--;//只删除一个元素,线性表长度减少1
return 1;
}
}
int ListTraverse(SqList L)//线性表的遍历,按照从前向后的顺序依次打印输出顺序表中的元素,
{
int i;
for (i = 0; i < L.lengh; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
return 1;
}
int main(int argc, char** argv) {
SqList L;
int i, n , j;
ElemType e1, e2, e3, e4, e5, e6, e7, e8, e9;
InitList(L);//创建线性表
printf("输出当前的线性列表:\n");
for (i = 1; i <= 5; i++)
{
ListInsert(L, i, i);//插入数据
}
ListTraverse(L);
GetElem(L, 1, e1);
printf("第一个元素是%d:\n",e1);
GetElem(L, 2, e2);
printf("第二个元素是%d:\n", e2);
ListDelete(L, 3, e3);
printf("第三个元素是:%d,将他删除后:\n",e3);
printf("输出当前的线性列表:\n");
ListTraverse(L);
e4 = ListModifyElem(L, 1, 99);//修改
printf("把第一个数字修改成99,修改是否成功:%d\n", e4);
printf("输出当前的线性列表:\n");
ListTraverse(L);
e5 = LocateElem(L,4);
printf("元素4所在的位置是%d:\n",e5);
e6=ListLength(L);
printf("当前此链表的长度是%d:\n", e6);
e7 = ListEmpty(L);
if (e7 == 1)
{
printf("当前线性列表是一个空链表!\n");
}
else
{
printf("当前线性列表是一个非空链表!\n");
}
NextElem(L, 4, e8);
printf("数字4的后继元素是:%d\n", e8);
PriorElem(L, 2, e9);
printf("数字2的前驱元素是:%d\n", e9);
ClesrList(L);
e7 = ListEmpty(L);
if (e7 == 1)
{
printf("当前线性列表是一个空链表!\n");
}
else
{
printf("当前线性列表是一个非空链表!\n");
}
DestoryList(L);
return 0;
}