顺序表
- 定义顺序表的结构
typedef int ELemType;
typedef struct
{
ELemType data[MaxSize];
int length;
}SqList;
- 建立顺序表
//建立顺序表函数
void CreateList(SqList* &L, ELemType* a, int n)
{
L = new SqList;
for (int i = 0; i < n; i++)
{
L->data[i] = a[i];
}
L->length = n;
}
- 销毁线性表
//销毁线性表
void Destory(SqList* L)
{
delete L;
cout << "销毁成功" << endl;
}
- 输出线性表
//输出线性表
void Display(SqList* L)
{
for (int i = 0; i < L->length; i++)
{
cout << L->data[i] << endl;
}
}
- 在第i个位置插入元素(i为物理位置)
bool Insert(SqList* L,ELemType e,int i)
{
i = i - 1;
if (i<0 || i>L->length || L->length==MaxSize)
return false;
for (int j = L->length; j >=i+1 ; j--)
{
L->data[j] = L->data[j - 1];
}
L->data[i] = e;
L->length++;
return true;
}
- 通过位置删除元素
bool Del(SqList* L, ELemType& e, int i)
{
i = i - 1;
if (i<0 || i>L->length - 1)
return false;
e = L->data[i];
for (int j = i; i <= L->length-2; j++)
{
L->data[j] = L->data[j + 1];
}
L->length--;
return true;
}
- 按照元素位置查找元素
bool FindByPosition(SqList* L,int i)
{
i = i - 1;
if (i<0 || i>L->length - 1) return false;
int j = 0;
while (j < i)
{
j++;
}
cout << L->data[j] << endl;
}
- 按照元素值查找元素
bool FindByValue(SqList* L, ELemType e)
{
for (int i = 0; i < L->length; i++)
{
if (L->data[i] == e)
{
cout << L->data[i] << endl;
cout << "该元素的位置为" << i + 1 << endl;
return true;
}
}
return false;
}
- 测试代码
#include<iostream>
using namespace std;
#define MaxSize 50
typedef int ELemType;
typedef struct
{
ELemType data[MaxSize];
int length;
}SqList;
//建立顺序表函数
void CreateList(SqList* &L, ELemType* a, int n)
{
L = new SqList;
for (int i = 0; i < n; i++)
{
L->data[i] = a[i];
}
L->length = n;
}
//销毁线性表
void Destory(SqList* L)
{
delete L;
cout << "销毁成功" << endl;
}
//输出线性表
void Display(SqList* L)
{
for (int i = 0; i < L->length; i++)
{
cout << L->data[i] << endl;
}
}
//插入元素,i为物理位置
bool Insert(SqList* L,ELemType e,int i)
{
i = i - 1;
if (i<0 || i>L->length || L->length==MaxSize)
return false;
for (int j = L->length; j >=i+1 ; j--)
{
L->data[j] = L->data[j - 1];
}
L->data[i] = e;
L->length++;
return true;
}
//删除元素,保存删除的元素
bool Del(SqList* L, ELemType& e, int i)
{
i = i - 1;
if (i<0 || i>L->length - 1)
return false;
e = L->data[i];
for (int j = i; i <= L->length-2; j++)
{
L->data[j] = L->data[j + 1];
}
L->length--;
return true;
}
//按照元素位置查找元素(物理位置)
bool FindByPosition(SqList* L,int i)
{
i = i - 1;
if (i<0 || i>L->length - 1) return false;
int j = 0;
while (j < i)
{
j++;
}
cout << L->data[j] << endl;
}
//按照元素值查找元素
bool FindByValue(SqList* L, ELemType e)
{
for (int i = 0; i < L->length; i++)
{
if (L->data[i] == e)
{
cout << L->data[i] << endl;
cout << "该元素的位置为" << i + 1 << endl;
return true;
}
}
return false;
}
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
{
a[i] = i;
}
SqList *L1 = NULL;
int e=0;
CreateList(L1, a, 10);
Insert(L1, 10, 11);
Display(L1);
cout << "---------" << endl;
FindByPosition(L1, 10);
cout << "----------" << endl;
FindByValue(L1, 5);
Destory(L1);
return 0;
}
链表
单链表
- 定义单链表的结构
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode* next;
}LinkNode;
- 头插入建立单链表
void CreateListF(LinkNode*& L, ElemType* a, int n)
{
LinkNode* s;
L = new LinkNode;
L->next = NULL;
for (int i = 0; i < n; i++)
{
s = new LinkNode;
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
- 尾插建立单链表
void CreateListR(LinkNode*& L, ElemType* a, int n)
{
LinkNode* s, * r;
L = new LinkNode;
r = L;//尾插时头结点不能丢
for (int i = 0; i < n; i++)
{
s = new LinkNode;
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
- 销毁单链表(方法1)
void DestoryList01(LinkNode* L)
{
LinkNode* pre, * p;
pre = L, p = L->next;
while (p != NULL)
{
delete pre;
pre = p;
p = pre->next;
}
delete pre;//p 为NULL时pre指向最后一个节点
cout << "销毁成功" << endl;
}
- 销毁单链表(方法2)
void DestoryList02(LinkNode* L)
{
LinkNode* p, * q;
q = L;
while ( q != NULL)
{
p = q->next;
delete q;
q = p;
}
}
void DestoryList03(LinkNode* L)
{
LinkNode* p, * q;
q = L;
while (q != NULL)
{
p = q;
q = q->next;
delete p;
}
}
- 输出线性表
void Display(LinkNode* L)
{
LinkNode* p = L->next;
while (p != NULL)
{
cout << p->data << endl;
p = p->next;
}
}
- 求单链表的长度
void LengthList(LinkNode* L)
{
LinkNode* p = L;
int n = 0;
while (p->next != NULL)
{
n++;
p = p->next;
}
cout << n << endl;
LinkNode* q = L->next;
int b = 0;
while (q != NULL)
{
b++;
q = q->next;
}
cout << b << endl;
}
- 按序号求元素的值
bool GetElem(LinkNode* L,int i,ElemType& e)
{
LinkNode* p = L;
int j = 0;
if (i <= 0) return false;
while (j < i && p != NULL)
{
p = p->next;
j++;
}
if (p == NULL)
{
return false;
}
else
{
e = p->data;
return true;
}
}
- 查找第i个元素并返回该元素的地址
这个函数在查找和删除操i做经常用,所以建议单独封装成一个函数方便后续使用
LinkNode* FindNode(LinkNode* L, int i)
{
LinkNode* p = L;
int j = 0;
while (j < i && p != NULL)
{
p = p->next;
j++;
}
if (p == NULL)
{
return NULL;
}
else
{
return p;
}
}
- 插入数据
bool InsertList(LinkNode* L, int i, ElemType e)
{
if (i <= 0) return false;
LinkNode* p = FindNode(L, i - 1);
if (p != NULL)
{
LinkNode* s=new LinkNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
else return false;
}
- 删除数据
bool DelList(LinkNode* L, int i, ElemType& e)
{
if (i <= 0) return false;
LinkNode* p = FindNode(L, i - 1);
if (p != NULL)
{
if (p->next == NULL)
{
return false;
}
else
{
LinkNode* s = p->next;
p->next = s->next;
e = s->data;
delete s;
return true;
}
}
}
- 测试代码
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode* next;
}LinkNode;
//头插法建立单链表(含头结点)
void CreateListF(LinkNode*& L, ElemType* a, int n)
{
LinkNode* s;
L = new LinkNode;
L->next = NULL;
for (int i = 0; i < n; i++)
{
s = new LinkNode;
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
//尾插
void CreateListR(LinkNode*& L, ElemType* a, int n)
{
LinkNode* s, * r;
L = new LinkNode;
r = L;//尾插时头结点不能丢
for (int i = 0; i < n; i++)
{
s = new LinkNode;
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
//初始化线性表
void CreateList(LinkNode*& L)
{
L = new LinkNode;
L->next = NULL;
}
//销毁线性表
void DestoryList01(LinkNode* L)
{
LinkNode* pre, * p;
pre = L, p = L->next;
while (p != NULL)
{
delete pre;
pre = p;
p = pre->next;
}
delete pre;//p 为NULL时pre指向最后一个节点
cout << "销毁成功" << endl;
}
void DestoryList02(LinkNode* L)
{
LinkNode* p, * q;
q = L;
while ( q != NULL)
{
p = q->next;
delete q;
q = p;
}
}
void DestoryList03(LinkNode* L)
{
LinkNode* p, * q;
q = L;
while (q != NULL)
{
p = q;
q = q->next;
delete p;
}
}
//判断线性表是否为空
bool ListEmpty(LinkNode* L)
{
return L->next;
}
//输出线性表
void Display(LinkNode* L)
{
LinkNode* p = L->next;
while (p != NULL)
{
cout << p->data << endl;
p = p->next;
}
}
//求线性表的长度
void LengthList(LinkNode* L)
{
LinkNode* p = L;
int n = 0;
while (p->next != NULL)
{
n++;
p = p->next;
}
cout << n << endl;
LinkNode* q = L->next;
int b = 0;
while (q != NULL)
{
b++;
q = q->next;
}
cout << b << endl;
}
//按序号求元素的值
bool GetElem(LinkNode* L,int i,ElemType& e)
{
LinkNode* p = L;
int j = 0;
if (i <= 0) return false;
while (j < i && p != NULL)
{
p = p->next;
j++;
}
if (p == NULL)
{
return false;
}
else
{
e = p->data;
return true;
}
}
//查找第i个元素点并返回该节点的地址
LinkNode* FindNode(LinkNode* L, int i)
{
LinkNode* p = L;
int j = 0;
while (j < i && p != NULL)
{
p = p->next;
j++;
}
if (p == NULL)
{
return NULL;
}
else
{
return p;
}
}
//插入数据
bool InsertList(LinkNode* L, int i, ElemType e)
{
if (i <= 0) return false;
LinkNode* p = FindNode(L, i - 1);
if (p != NULL)
{
LinkNode* s=new LinkNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
else return false;
}
//删除数据
bool DelList(LinkNode* L, int i, ElemType& e)
{
if (i <= 0) return false;
LinkNode* p = FindNode(L, i - 1);
if (p != NULL)
{
if (p->next == NULL)
{
return false;
}
else
{
LinkNode* s = p->next;
p->next = s->next;
e = s->data;
delete s;
return true;
}
}
}
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
{
a[i] = i + 1;
}
int e;
LinkNode* b;
LinkNode* L1 = NULL;
CreateListR(L1, a, 10);
Display(L1);
cout << "----" << endl;
LengthList(L1);
cout << "----" << endl;
GetElem(L1, 5, e);
cout << e << endl;
cout << "----" << endl;
b = FindNode(L1, 5);
cout << b->data << endl;
cout << "----" << endl;
InsertList(L1, 11, 11);
Display(L1);
cout << "----" << endl;
DelList(L1, 11, e);
cout << e << endl;
DestoryList01(L1);
return 0;
}
双链表
- 头插法
void CreateListF(DLinkNode*& L, ElemType* a, int n)
{
L = new DLinkNode;
DLinkNode* s;
L->prior = L->next = NULL;
for (int i = 0; i < n; i++)
{
s = new DLinkNode;
s->data = a[i];//s->data=*(a+i);
s->next = L->next;
if (L->next != NULL)
{
L->next->prior = s;
}
L->next = s;
s->prior = L;
}
}
- 尾插法
void CreateListR(DLinkNode*& L, ElemType* a, int n)
{
L = new DLinkNode;
DLinkNode* r = L, * s;
for (int i = 0; i < n; i++)
{
s = new DLinkNode;
s->data = a[i];
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
}
循环链表
循环单链表是将尾节点的next指针域指向头节点,判断尾节点的条件是p->next==NULL
循环双链表是将尾部节点的next指针域指向头节点,将头节点的prior指针域指向尾节点,判断尾节点的条件为p->next==NULL,循环双链表中可以通过p->prior快速找到尾节点