因为自我感觉各种变量起的名字都很明显,函数名也很标准就没怎么写注释,其实主要是我懒。
所有的由用户输入的下标都是现实下标,而非数组中的下标,故而使用时都需要index-1;
头文件
/*
要实现的操作
1初始化
2创建
3判断是否为空
4判断是否为满
5返回指定的元素
6遍历顺序表
7查找指定元素
8在指定下标插入指定元素
9删除指定下标元素
10返回顺序表的长度
11修改顺序表指定下标的值为指定元素
12销毁顺序表
*/
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
typedef int Status;
typedef int ElemType;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//定义线性表结构
typedef struct {
ElemType* Link;
int length;
}Sqlist;
Status Init(Sqlist& QL);
Status Create(Sqlist& QL,int length);
Status IsEmpty(const Sqlist& QL);
Status IsFull(const Sqlist& QL);
Status GetElem(const Sqlist& QL,ElemType &e,int index);
Status Display(const Sqlist& QL);
Status LocateElem(const Sqlist& QL,ElemType e,int &index);
Status Insert(Sqlist& QL,ElemType e,int index);
Status Delete(Sqlist& QL,int index);
Status GetLength(const Sqlist& QL,ElemType &e);
Status UpadteValue(Sqlist& QL, ElemType e, int index);
Status Destroy(Sqlist& QL);
头文件各种函数的实现
#include"Sqlist.h"
Status Init(Sqlist& QL)
{
QL.Link = new ElemType[MAXSIZE];
if (!QL.Link)
{
return OVERFLOW;
}
QL.length = 0;
return OK;
}
Status Create(Sqlist& QL,int length)
{
QL.length=length;
if (QL.length > MAXSIZE)
{
cout << "溢出\n";
QL.length = 0;
return OVERFLOW;
}
if (QL.length < 0)
{
cout << "输入长度不可以为负数\n";
QL.length = 0;
return ERROR;
}
cout << "请输入顺序表内的元素";
for (int i = 0; i < QL.length; i++)
{
cin >> QL.Link[i];
}
return OK;
}
Status IsEmpty(const Sqlist& QL)
{
if (QL.length == 0)
{
cout << "顺序表为空\n";
return true;
}
else
{
return false;
}
}
Status IsFull(const Sqlist& QL)
{
if (QL.length == MAXSIZE)
{
cout << "顺序表已满\n";
return true;
}
else
{
return false;
}
}
Status GetElem(const Sqlist& QL,ElemType& e,int index)
{
if (index > QL.length)
{
cout << "超过顺序表长度\n";
return ERROR;
}
if (index < 0)
{
cout << "下标不应该为负数\n";
return ERROR;
}
//这里想要想要取得的元素是客户指出的,但是顺序表中的首个元素是从0开始
e = QL.Link[index-1];
return OK;
}
Status Display(const Sqlist& QL)
{
if (IsEmpty(QL))
{
return ERROR;
}
for (int i = 0; i < QL.length;i++)
{
cout << QL.Link[i]<<' ';
}
cout << endl;
return OK;
}
Status LocateElem(const Sqlist& QL,ElemType e,int& index)
{
if (IsEmpty(QL))
{
return ERROR;
}
for (int i = 0; i < QL.length; i++)
{
if (QL.Link[i] == e)
{
index=i+1;
return OK;
}
}
cout << "未找到该元素\n";
return ERROR;
}
Status Insert(Sqlist& QL, ElemType e, int index)
{
if (IsFull(QL))
{
return ERROR;
}
if (index < 0||index>QL.length+1)
{
cout << "插入位置不合理\n";
return ERROR;
}
QL.Link[QL.length] = 0;
for (int k = QL.length; k>=index; k++)
{
QL.Link[k] = QL.Link[k - 1];
}
QL.Link[index-1] = e;
QL.length++;
return OK;
}
Status Delete(Sqlist& QL, int index)
{
if (IsEmpty(QL))
{
return ERROR;
}
if (index>QL.length||index<0)
{
cout << "删除位置不合理\n";
return ERROR;
}
for (int k = index-1; k < QL.length-1; k++)
{
QL.Link[k] = QL.Link[k + 1];
}
QL.length--;
return OK;
}
Status GetLength(const Sqlist& QL, ElemType& e)
{
e = QL.length;
return OK;
}
Status UpadteValue(Sqlist& QL, ElemType e, int index)
{
if (IsEmpty(QL))
{
return ERROR;
}
if (index > QL.length)
{
cout << "下标超出链表长度\n";
return ERROR;
}
QL.Link[index - 1] = e;
return OK;
}
Status Destroy(Sqlist& QL)
{
delete[] QL.Link;
QL.length = 0;
return OK;
}
主函数各种调用
#include"Sqlist.h"
int main()
{
char key = 'a';
cout << "----------------------------------------\n";
cout << "欢迎使用线性表\n";
Sqlist L;
ElemType e;
int index, length;
while (key != 'q')
{
cout << "请您输入您要执行的操作\n"
<< " a初始化 b创建\n"
<< " c判断是否为空 d判断是否为满\n"
<< " e返回指定的元素 f遍历顺序表\n"
<< " g查找指定元素 h在指定位置插入指定元素\n"
<< " i删除指定的元素 j返回链表的长度\n"
<< " k修改链表指定下标的值 l销毁链表\n"
<< " q退出\n"
<< "----------------------------------------\n";
cin >> key;
switch (key)
{
case 'a':
Init(L); break;
case 'b':
cout << "请您输入线性表的长度";
cin >> length;
Create(L, length); break;
case 'c':
if (!IsEmpty(L))
{
cout << "非空\n";
}break;
case 'd':
if (!IsFull(L))
{
cout << "未满\n";
}
break;
case 'e':
cout << "请您输入您想要取的元素下标__\b\b";
cin >> index;
if (GetElem(L, e, index)) {
cout << e << endl;
}
break;
case 'f':
Display(L); break;
case 'g':
cout << "请输入您想要查找的元素__\b\b";
cin >> e;
if (LocateElem(L, e, index)) {
cout << "您查找的元素下标在:" << index << endl;
}
break;
case'h':
cout << "请您输入您要插入的位置__\b\b";
cin >> index;
cout << "请您输入您要插入的元素__\b\b";
cin >> e;
Insert(L, e, index); break;
case 'i':
cout << "请您输入您要删除的位置__\b\b";
cin >> index;
Delete(L, index); break;
case 'j':
GetLength(L, length);
cout << "顺序表的长度为:" << length << endl; break;
case 'k':
cout << "请您输入您要修改的位置__\b\b";
cin >> index;
cout << "请您输入想要修改的值__\b\b";
cin >> e;
UpadteValue(L, e, index); break;
case 'l':
Destroy(L); break;
case 'q':
cout << "Bye!"; break;
default:
cout << "请您输入正确的操作\n";
break;
}
cout << "----------------------------------------\n";
}
return 0;
}