非匿名结构体指针类型的定义:
typedef int ElemType;
typedef int Status;
typedef struct LNode {
ElemType data;//数据域
struct LNode* next;//指针域,用自己定义自己(嵌套定义)
}LNode, * LinkList;//LinList为指向结构体Lnode的指针类型
初始化单链表:
LinkList InitList()
{
LinkList L = new LNode;//头节点,通过new一份内存空间,生成头节点
L->next = NULL;//头节点的指针域置空
ListEmpty(L);//判断是否new成功
return L;//用一个L接受初始化的表头
}
单链表的尾插法:
void InputList(LinkList& L)
{
LNode* p = L;//相当于尾指针
int n;
cout << "请输入链表节点数:";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "单链表的数域";
LNode* code = new LNode;
code->next = NULL;//尾插法
cin>>code->data;
p->next = code;
p = code;//尾指针指向新的尾节点
}
打印链表函数:
void print(LinkList L)
{
LNode* p = L->next;//即不打印头节点,因为头节点数据域是空
while (p)//通过判断p值来确定是否继续,当p值为空是,将退出循环
{
cout << p->data << endl;
p = p->next;
}
}
求表长
int ListLength(LinkList L)
{
LinkList p;//用LNode*p也ok
p = L->next;
int cout = 0;
while (p)
{
cout++;
p = p->next;
}
return cout;
}
单链表的取值算法:
Status GetElem_L(LinkList L, int i)
{
LinkList p;
p = L->next;
int j = 1;//初始化
while (p && j < i)//像后面扫描,当扫面到位置i时,可以直接输出数据
{
p = p->next;
j++;
}
if (!p || j > i)//判断扫描结果是否合理
return 0;
else
return p->data;
return 0;
}
查找操作:
LNode* LocateElem_L(LinkList L, ElemType e)
{
LNode* p;
p = L->next;
while (p && p->data != e)//获得地址
{
p = p->next;
}
return p;
}
//按置查找,根据指定数据获取该元素的位置序号
int LocateElem_L2(LinkList L, ElemType e)
{
LNode* p;
int j = 1;
p = L->next;
while (p && p->data != e)//按照数据域查找,操作,并获得该位置i
{
p = p->next;
j++;
}
if (p)
return j;
else
cout << "该元素不存在" << endl;
return 0;
}
//插入节点算法
Status ListInsert_L(LinkList& L, int i, ElemType e)
{
LNode* p=L;
int j = 0;
while (p && j < i - 1)//寻找第i的位置,并确定p的地址
{
p = p-> next;
++j;
}
if (!p || j > i - 1)
return 0;
LNode* s;
s = new LNode;
s->data = e;
s->next = p->next;//更改节点,使s插入到p里面
p->next = s;
return 1;
}
删除节点的算法
Status ListDelete(LinkList& L, int i, ElemType& e)
{
LNode* q = new LNode;
LNode* p = L;
int j = 0;
while (p->next && j < i - 1)
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1)
return 0;
q = p->next;
p->next = q->next;
e = q->data;
delete q;
return 1;
}
单链表的合并
void MergeList(LinkList& L1, LinkList& L2)
{
int L1_len = ListLength(L1);
int L2_len = ListLength(L2);
for (int i = 1; i <= L2_len; i++)
{
int e=GetElem_L(L2, i);//判断元素是否存在
if (!(LocateElem_L2(L1, e)))
{
ListInsert_L(L1,++L1_len, e);//通过判断位置的改变来进行改变插入的位置
}
}
}