静态分配
#define MaxSize 100//宏定义数组大小
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;//自定义数据类型
typedef int ElemType;
#include<iostream>
using namespace std;
typedef struct
{
ElemType date[MaxSize];//数据存储
int length;//线性表长度
}SqList;
void InitList(SqList& L)//初始化线性表
{
for (int i = 0; i < MaxSize; i++)
{
L.date[i] = 0;
}
L.length = 0;
}
Status ListInsert(SqList& L, int i, ElemType e)//在某一位置插入元素
{
if (i<1 || i>L.length + 1) return ERROR;//当位置有误时退出
if (L.length == MaxSize) return ERROR;//满表则退出
for (int j = L.length; j > i - 1; j--)//最后的元素开始依次后挪一位
{
L.date[j] = L.date[j - 1];//后一个元素等于前一个元素
}
L.date[i - 1] = e;//目标位置为e
++L.length;
return TRUE;
}
Status ListInsertHead(SqList& L, ElemType e)//线性表头插法
{
if (L.length == MaxSize) return ERROR;//满表则退出
for (int j = L.length; j > 0; j--)//最后的元素开始依次后挪一位
{
L.date[j] = L.date[j - 1];//后一个元素等于前一个元素
}
L.date[0] = e;//令第一个元素为所插入元素
++L.length;//表长加一
return TRUE;
}
Status ListInsertBack(SqList& L, ElemType e)//线性表尾插法
{
if (L.length == MaxSize) return ERROR;//满表则退出
int j = L.length;
L.date[j] = e;//最后的元素为e
++L.length;
return TRUE;
}
Status ListDelete(SqList& L, int i, ElemType& e)//删除某一位置元素并返回其值
{
if (L.length == 0) return ERROR;//空表
if (i<1 || i>L.length) return ERROR;
e = L.date[i - 1];//记录删除的元素
for (int j = i; j < L.length; j++)//此后的元素上前一位
{
L.date[j - 1] = L.date[j];
}
L.length--;//表长减一
return TRUE;
}
int LocateElem(SqList L, ElemType e)//返回指定元素位置
{
for (int i = 0; i < L.length; i++)//遍历查找
{
if (L.date[i] == e) return i + 1;
}
return 0;
}
Status ListRevise(SqList& L, int i, ElemType e)//修改第i个元素
{
if (L.length == 0) return ERROR;//空表
if (i<1 || i>L.length) return ERROR;
L.date[i - 1] = e;//将第i个元素改为e
return TRUE;
}
ElemType GetElem(SqList L, int i)//返回第i个元素
{
if (i<1 || i>L.length) return ERROR;//当位置有误时退出
return L.date[i - 1];
}
void PrintList(SqList L)//打印线性表
{
cout << "线性表的元素:";
for (int i = 0; i < L.length; i++)
{
cout << L.date[i] << " ";
}
}
int ListLength(SqList L)//返回线性表长度
{
cout << endl;
cout << "线性表的长度:";
return L.length;
}
Status Empty(SqList L)//判断是否为空表
{
if (L.length == 0) return TRUE;
return FALSE;
}
Status ClearList(SqList& L)//清空线性表
{
L.length = 0;
return TRUE;
}
int main()
{
SqList L;//定义线性表
int n, number;
int e;//一个整型变量、
cout << "输入数据个数:";
cin >> n;//输入数据个数 @3
InitList(L);//初始化
for (int i = 1; i < n + 1; i++)//依次插入数据
{
cin >> number;//输入元素 4 5 6
ListInsert(L, i, number);
}
ListInsertHead(L, 3);//头插3个元素
ListInsertHead(L, 2);
ListInsertHead(L, 1);
ListInsertBack(L, 7);//尾插3个元素
ListInsertBack(L, 8);
ListInsertBack(L, 9);
PrintList(L);//打印表
cout << ListLength(L) << endl;
cout << "值为7的元素的位置:" << LocateElem(L, 7) << endl;
cout << "第5个位置的元素是:" << GetElem(L, 5) << endl;
ListDelete(L, 3, e);//删除元素
cout << "删除的元素是:" << e << endl;
PrintList(L);
cout << endl;
cout << "将第1个元素修改为10->";
ListRevise(L, 1, 10);
PrintList(L);
cout << endl;
if (Empty(L)) cout << "空表" << endl;
else cout << "非空表" << endl;
ClearList(L);
PrintList(L);//打印表
return 0;
}
//优: 无逻辑关系 可随意存取任何元素
//缺: 插入,删除元素需要移动大量元素 存储空间不够灵活 当长度过大难以确定其容量 数据元素不能自由扩充
动态分配
菜单实现
#define MaxSize 5//初始分配空间
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;//自定义数据类型
typedef int ElemType;
#include<iostream>
using namespace std;
typedef struct
{
ElemType* a;//存储空间基地址
int capacity;//容量大小
int length;//线性表长度
}SqList;
Status InitList(SqList& L)//初始化线性表
{
L.a =(ElemType*) malloc(MaxSize * sizeof(ElemType));//申请分配空间
if (!L.a) return ERROR;
L.length = 0;
L.capacity = MaxSize;
return TRUE;
}
void ListCapacityCheck(SqList& L)//表满的增容操作
{
int newcapacity = L.capacity * 2;//新容量扩大为2倍
ElemType* elem = (ElemType*)realloc(L.a, newcapacity * sizeof(ElemType));//开辟一个新空间
if (!elem) exit(-1);//增容失败
L.a = elem;//指向新地址
L.capacity = newcapacity;
}
Status ListInsert(SqList& L, int i, ElemType e)//在某一位置插入元素
{
if (L.length >= L.capacity)//表满
ListCapacityCheck(L);
for (int j = L.length - 1; j >= i - 1; j--)//自插入位置前一位开始
{
L.a[j + 1] = L.a[j];//依次向后挪一位
}
L.a[i - 1] = e;//插入位置赋值
L.length++;//表长加一
return TRUE;
}
Status ListInsertHead(SqList& L, ElemType e)//线性表头插法
{
if (L.length >= L.capacity)//表满
ListCapacityCheck(L);
for (int i = L.length - 1; i >= 0; i--)//每一项后移一位
{
L.a[i+1] = L.a[i];
}
L.a[0] = e;//表头赋值
L.length++;
return TRUE;
}
Status ListInsertBack(SqList& L, ElemType e)//线性表尾插法
{
if (L.length >= L.capacity)//表满
ListCapacityCheck(L);
L.a[L.length] = e;//赋值
L.length++;//表长加一
return TRUE;
}
Status ListDeleteBack(SqList& L)//尾删
{
if (L.length == 0) return ERROR;
L.length--;
return TRUE;
}
Status ListDeleteHead(SqList& L)//头删
{
if (L.length == 0) return ERROR;
for (int i = 1; i < L.length ; i++)//从第二项开始向前挪一位
{
L.a[i-1] = L.a[i];
}
L.length--;
return TRUE;
}
Status ListDelete(SqList& L, int i, ElemType &e)//指定位置删除
{
if (L.length == 0) return ERROR;
if (i<1 || i>L.length) return ERROR;
e = L.a[i - 1];//记录删除元素
for (int j = i; j < L.length; j++)//从被删除的后一位开始前移一位
{
L.a[j - 1] = L.a[j];
}
L.length--;
return TRUE;
}
int LocateElem(SqList L, ElemType e)//返回指定元素位置
{
for (int i = 0; i < L.length ; i++)
{
if (L.a[i] == e)
return i + 1;
}
return 0;
}
Status ListRevise(SqList& L, int i, ElemType e)//修改第i个元素
{
if (L.length == 0) return ERROR;
if (i<1 || i>L.length) return ERROR;
L.a[i - 1] = e;
return TRUE;
}
ElemType GetElem(SqList L, int i)//返回第i个元素
{
if (L.length == 0) return ERROR;
if (i<1 || i>L.length) return ERROR;
return L.a[i - 1];
}
void PrintList(SqList L)//打印线性表
{
cout << "线性表元素:";
for (int i = 0; i < L.length; i++)
{
cout << L.a[i] << " ";
}
cout << endl;
}
int ListLength(SqList L)//返回线性表长度
{
if (!L.a) return ERROR;
return L.length;
}
int ListCapacity(SqList L)//返回容量
{
if (!L.a) return ERROR;
return L.capacity;
}
Status Empty(SqList L)//判断是否为空表
{
if (!L.a) return ERROR;
if (L.length == 0) return TRUE;
return FALSE;
}
Status ListDestory(SqList& L)//销毁表
{
free(L.a);
L.a = NULL;
L.length = L.capacity = 0;
return TRUE;
}
Status ClearList(SqList& L)//清空线性表
{
if(L.length)
L.length = 0;
return TRUE;
}
void show()
{
cout << "输入你想要的操作" << endl;
cout << "1.尾插法------------" << endl;
cout << "2.头插法------------" << endl;
cout << "3.指定位置插入------" << endl;
cout << "4.尾删--------------" << endl;
cout << "5.头删--------------" << endl;
cout << "6.指定位置删--------" << endl;
cout << "7.线性表的长度和容量" << endl;
cout << "8.更改元素----------" << endl;
cout << "9.清空表------------" << endl;
cout << "10.销毁表-----------" << endl;
cout << "11.返回某位置元素---" << endl;
cout << "12.返回元素的位置---" << endl;
cout << "13.输出线性表------" << endl;
cout << "0.退出--------------" << endl;
}
void menu()
{
show();
SqList L;//定义线性表
InitList(L);//初始化
int n = 1;
int locate;
ElemType number;
ElemType e;
while (n )
{
cin >> n;
switch (n)
{
case 1://尾插数据
cout << "输入五个数:";
for (int i = 0; i < 5; i++)
{
cin >> number;
ListInsertBack(L, number);
}
PrintList(L);
cout << "输入下次操作->";
break;
case 2://头插数据
cout << "输入一个数:";
cin >> number;
ListInsertHead(L, number);
PrintList(L);
cout << "输入下次操作->";
break;
case 3://指定位置插入
cout << "输入要插入的位置";
cin >> locate;
cout << "元素";
cin >> number;
ListInsert(L, locate, number);
PrintList(L);
cout << "输入下次操作->";
break;
case 4://尾删
ListDeleteBack(L);
cout << "尾删后:";
PrintList(L);
cout << "输入下次操作->";
break;
case 5://头删
ListDeleteHead(L);
cout << "头删后:";
PrintList(L);
cout << "输入下次操作->";
break;
case 6://指定位置删除
cout << "输入要删除的位置";
cin >> locate;
ListDelete(L, locate,e);
PrintList(L);
cout << "被删除的元素->" << e <<endl;
cout << "输入下次操作->";
break;
case 7://长度及容量
cout << "线性表的长度:" << ListLength(L) << "容量:" << ListCapacity(L) << endl;
cout << "输入下次操作->";
break;
case 8://更改元素
cout << "输入修改位置:";
cin >> locate;
cout << "输入新的数据:";
cin >> number;
ListRevise(L, locate, number);
PrintList(L);
cout << "输入下次操作->";
break;
case 9://清空表
ClearList(L);
cout << "输入下次操作->";
break;
case 10://销毁
cout << "销毁后只能执行退出!" << endl;
ListDestory(L);
break;
case 11://返回某位置元素
cout << "你想知道第几个元素:";
cin >> locate;
cout<<"他是->"<<GetElem(L, locate)<<endl;
cout << "输入下次操作->";
break;
case 12://返回元素位置
cout << "你想知道的元素:";
cin >> e;
LocateElem(L, e);
if (LocateElem(L,e) == 0) cout << "没有找到请换一个输入!" << endl;
else cout << "在这->" << LocateElem(L, e) << endl;
cout << "输入下次操作->";
break;
case 13://打印线性表
PrintList(L);
cout << "输入下次操作->";
break;
case 0://结束
cout << "退出线性表"<< endl;
cout << "输入0结束程序" << endl;
break;
default:
cout << "输入错误"<<endl;
break;
}
}
}
int main()
{
int flag;
cout << "输入1开始--" << endl;
cout << "输入0结束--" << endl;
do
{
cin >> flag;
switch (flag)
{
case 1:
menu();
break;
case 0:
cout << "结束";
return 0;
default:
break;
}
}while(flag);
return 0;
}