#include<iostream>
using namespace std;
typedef int Status;
typedef struct LNode
{
int date;
struct LNode* next;
}LNode,*LinkList;
//算法1:对单链表的初始化
Status InitList_L(LinkList& L)
{
L = new LNode;//C语言版本 L=(LinkList)malloc(sizeof(LNode));
//上面这部就是开辟一个新的节点 然后L指向这个新的节点
L->next = NULL;
return 0;
}
//算法2:判断单链表是否为空
Status LinkEmpty(LinkList L)
{
if (L->next)
return 0;//非空
else return 1;//空的
}
//算法3:销毁一个单链表
Status DestoryList_L(LinkList &L)
{
LNode* p;
while (L)
{
p = L;
L = L->next;
delete p;
}
return 0;
}
// 算法4:清空链表
Status ClearList_L(LinkList& L)
{
LNode* p;
LNode* q;
p = L->next;
while (p)
{
q = p->next;
delete p;
p = q;
}
L->next = NULL;
return 0;
}
//算法5:求链表的表长
Status LengthList_L(LinkList L)
{
LinkList p;
int i = 0;
p = L->next;
while (p)
{
i++;
p = p->next;
}
return i;
}
//算法6:取单链表中第i个元素
Status GetElem_L(LinkList L, int i, int e)
{
LNode* p;
p = L->next;
int j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p || j > i) return 1;
e = p->date;
return 0;
}
//算法7:头插法
void Headinsert_L(LinkList& L,int n)//这里的n是指插入几次
{
LNode *p;
L = new LNode;
L->next = NULL;
for (int i = 0; i < n; i++)
{
p = new LNode;
cin >> p->date;
p->next = L->next;
L->next = p;
}
}
//算法8:尾插法
void Taillinset_L(LinkList& L, int n)
{
LNode* p, * r;//r是尾指针
L = new LNode;
L->next = NULL;
r = L;
for (int i = 0; i < n; i++)
{
p = new LNode;
cin >> p->date;
p->next = NULL;
r ->next = p;
r = r->next;
}
}
//算法9:有序表的合并
void Combine_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LNode* pa, * pb, * pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;
while (pa && pb)//La和Lb都没到最后一个节点
{
if (pa->date < pb->date)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
delete pb;
}
//算法10:按值查找 得到该数据的位置序号
int LocateElem_L(LinkList L, int e)
{
LNode* p;
int j = 1;
p = L->next;
while (p && p->date != e)
{
p = p->next;
j++;
}
if (p) return j;
else return 0;
}
//算法11:按位查找(是下面删除第i个节点的基础)//这里就返回该指针所指向的节点
LNode* GetElem(LinkList L, int i)
{
if (i < 0) return NULL;
LNode* p;
p = L;
int j = 0;
while (p && j < i)
{
p = p->next;
j++;
}
return p;
}
//算法12:删除第i个节点
Status delete_L(LinkList& L, int i,int &e)
{
LNode* p, * q;
//首先你要找到这个待删除节点的前一个节点
p = GetElem(L, i-1);
q = p->next;
p->next = p->next->next;
e = q->date;
delete q;
return 0;
}
(数据结构)单链表的几种算法
于 2023-10-11 15:23:21 首次发布