b站 《数据结构与算法基础(青岛大学-王卓)》
所用教材《数据结构C语言版第二版》 中国工信出版集团 人民邮电出版社出版 严蔚敏 编著
代码中名称有些按自己想法写的,只能给一些基本操作供大家参考
#include<iostream>
using namespace std;
class Elem {
public:
int name;
};
class Lnode {
public:
Elem data;
Lnode* next;
};
void initlist(Lnode *&L); //创建链表
void DestroyList(Lnode *&L); //删除链表
void ClearList(Lnode* &L); //清空链表
int ListLength(Lnode* L); //返回链表的表长
int GetElem(Lnode* L, int i, Elem& e); //查找第i个元素并返回其值
int LocateElem(Lnode* L, Elem e); //查找与e相同的值并返回是第几个元素
int ListInsert(Lnode* &L, int i, Elem e); //插入1个结点
int ListDelete(Lnode* &L, int i); //删除一个结点
void CreateList_First(Lnode* &L, int n); //创建一个带有头结点的n个结点的链表(头插法建立链表)
void CreateList_Last(Lnode* &L, int n); //尾插法建立链表
void MergeList(Lnode* LA, Lnode* LB, Lnode* &LC); //合并链表
void initlist(Lnode* &L) //创建链表
{
L = new Lnode;
L->next= nullptr;
}
void DestroyList(Lnode* &L) //删除链表
{
Lnode* p;
while (L)
{
p = L;
L = L->next;
delete p;
}
}
void ClearList(Lnode* &L) //清空链表
{
Lnode* p, * q;
p = L->next;
while (p)
{
q = p->next;
delete p;
p = q;
}
L->next = nullptr;
}
int ListLength(Lnode* L) //返回链表的表长
{
Lnode* p = L->next;
int Length = 0;
while (p)
{
Length++;
p = p->next;
}
return Length;
}
int GetElem(Lnode* L, int i, Elem& e) //查找第i个元素并返回其值
{
int j = 1;
Lnode* p=L->next;
while(p&&j<i)
{
p = p->next;
j++;
}
if (!p || i < j)
{
cerr << ("您查找的数不存在");
return 1;
}
e = p->data;
}
int LocateElem(Lnode* L, Elem e) //查找与e相同的值并返回是第几个元素
{
Lnode* p = L->next;
int i = 1;
while (p && p->data.name != e.name)
{
p = p->next;
i++;
}
return i;
if (!p)
return 1;
}
int ListInsert(Lnode* &L, int i, Elem e) //插入1个结点
{
Lnode* p = L;
int j = 0;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p||j>i-1)return 1; //i大于表长+1或i<1,就error
Lnode *s = new Lnode;
s->data = e;
s->next = p->next;
p->next = s;
}
int ListDelete(Lnode* &L, int i) //删除一个结点
{
Lnode*q,* p=L;
int j = 0;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p || j > i - 1)return 1;
q = p->next;
p->next = p->next->next;
delete q;
}
void CreateList_First(Lnode* &L, int n) //头插法建立链表
{
L = new Lnode;
L->next = nullptr; //建立一个带头结点的单链表
for (int i = n; i > 0; i--)
{
Lnode* p = new Lnode;
cin >> p->data.name;
p->next = L->next; //插入到表头
L->next = p;
}
}
void CreateList_Last(Lnode*& L, int n) //尾插法建立链表
{
L = new Lnode;
L->next = nullptr;
Lnode* r = L; //尾指针r指向链表的尾结点
for (int i = 0; i < n; i++)
{
Lnode* p = new Lnode;
cin >> p->data.name;
r->next = p;
p->next = nullptr;
r = p;
}
}
void MergeList(Lnode* LA, Lnode* LB, Lnode* &LC) //合并链表
{
Lnode* pa = LA->next;
Lnode* pb = LB->next;
LC = LA;
Lnode* pc = LC;
while (pa && pb)
{
if(pa->data.name <= pb->data.name)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb; //插入剩余段
delete LB; //删除剩下的头结点
}
int main()
{
}