顺序表
#include <iostream>
using namespace std;
constexpr auto MAXSIZE = 100;
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;
//顺序表的存储结构
typedef struct
{
ElemType* elem;
int length;
}SqList;
//构造一个空的顺序表
int InitList(SqList &L)
{
//申请MAXSIZE个ElemType型变量空间,整型指针L.elem指向该地址空间开始处
L.elem = new ElemType[MAXSIZE];
if (!L.elem) exit(OVERFLOW);
L.length = 0;
return OK;
}
//取值--通过e返回第i个元素的传值
int GetElem(SqList L, int i, ElemType& e)
{
if (i<1 || i>L.length) return ERROR; //判断i值是否合理
e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
//查找--在顺序表L中查找值为e的数据元素,返回其序号
int LocateElem(SqList L, ElemType e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == e) return i + 1; //查找成功,返回序号i+1
}
return 0; //查找失败,返回0
}
//插入--在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1
int ListInsert(SqList& L, int i, ElemType e)
{
if ((i < 1) || (i > L.length + 1)) return ERROR; //i值不合法
if (L.length == MAXSIZE) return ERROR; //当前存储空间已满
for (int j = L.length - 1; j >= i; j--)
L.elem[j + 1] = L.elem[j];
L.elem[i - 1] = e;
++L.length;
return OK;
}
//删除--在顺序表删除第i个元素,i值的合法范围是1<=i<=i.length
int ListDelete(SqList& L, int i)
{
if ((i < 1) || (i > L.length)) return ERROR;
for (int j = 0; j <= L.length - 1; j++)
L.elem[j - 1] = L.elem[j];
--L.length;
return OK;
}
int main()
{
SqList L;
ElemType e;
int i;
//顺序表的初始化方法测试
if (InitList(L) == 1)
{
cout << "顺序表初始化成功" << endl;
cout << "当前顺序表长度: " << L.length << endl;
}
//为方便测试其他方法,将顺序表L初始化赋值一些数据
int num[] = { 12,13,21,24,28,30,42,77 };
for (int n = 0; n < sizeof(num) / sizeof(num[0]); n++)
{
L.elem[n] = num[n];
L.length++;
}
cout << "赋值完成,当前顺序表长度: " << L.length << endl;
//测试顺序表的取值--返回第3个元素的值到e
if (GetElem(L, 3, e)) cout << "第3个元素的值是: " << e << endl;
//测试顺序表的查找--查找元素24的位置并返回
if (int index = LocateElem(L, 24)) { cout << "24的序号是: " << index << endl; }
else cout << "元素查找失败!" << endl;
//测试顺序表的插入--在第5个位置插入25
if (ListInsert(L, 5, 25)) cout << "插入后第5个位置为: " << L.elem[4] << endl;
//测试顺序表的删除--删除第4个元素
if (ListDelete(L, 4)) cout << "删除成功!" << endl;
}
单链表
#include <iostream>
using namespace std;
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;
//单链表的存储结构
typedef struct LNode
{
ElemType data;
struct LNode* next; //结点的指针域
}LNode, * LinkList; //LinkList为指向结构体LNode的指针类型
//构造一个空的单链表L
int InitList(LinkList& L)
{
L = new LNode; //生成新的结点为头结点,用头指针L指向头结点
L->next = NULL; //头结点指针域为空
return OK;
}
//创建单链表--(前插法)逆位序输入n个元素的值,建立带表头结点的单链表
void CreateList_H(LinkList& L, int n) {
L = new LNode;
L->next = NULL; //建立一个带有头结点的单链表
LinkList p;
for (int i = n; i > 0; i--) {
p = new LNode;
cin >> p->data;
p->next = L->next;
L->next = p;
}
}
//创建单链表--(后插法)正位序输入n个元素的值,建立带表头结点的单链表
void CreateList_R(LinkList& L, int n) {
L = new LNode;
L->next = NULL; //建立一个带有头结点的单链表
LinkList r = L; //尾指针r指向头结点
LinkList p;
for (int i = 0; i < n; ++i) {
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p; //r=上一个,所以将上一个结点next指向新建的p
r = p; //r指向新的尾结点*p
}
}
//插入--在带有头结点的单链表L中第i个位置插入值为e的新节点
int ListInsert(LinkList& L, int i, int e) {
LinkList p = L;
int j = 0;
//查找第i-1个结点,指向该结点
while (p && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL || j < i - 1) return ERROR;//检查插入位置是否合法
LinkList s;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除位置i上的元素,并由e返回删除的元素
int ListDelete(LinkList& L, int i) {
LinkList p = L, q;
int j = 0;
while (p->next && i - 1 > j) {//查找第i-1个结点,指向该结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) return ERROR; //删除位置不合法
q = p->next;
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放空间q
return OK;
}
//取值--在带有头结点的单链表L中根据序号i通过e返回第i个数据
int GetElem(LinkList L, int i, ElemType& e) {
LinkList p;
p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) return ERROR;
e = p->data;
return OK;
}
//查找--在带有头结点的单链表L中查找值为e的元素
LNode* LocateElem(LinkList L, ElemType e)
{
LinkList p = L->next; //初始化p指向首元结点
while (p != NULL && p->data != e)
{
p = p->next;
}
return p; //查找成功返回为e的结点地址p,失败则p为NULL
}
//方便测试输入单链表
void printLinklist(LinkList L) {
LinkList p;
p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
}
int main()
{
LinkList L;
CreateList_H(L, 3);//创建一个长度为3的单链表
printLinklist(L);
cout << endl;
ListInsert(L, 2, 8);//向第二个位置插入8
printLinklist(L);
cout << endl;
ListDelete(L, 1);//删除第一个位置的元素
printLinklist(L);
cout << endl;
ElemType e;
GetElem(L, 2, e); cout << e << endl;
cout << LocateElem(L, 12);
return 0;
}