1.单链表的结点类型定义
typedef struct LNode
{ int data;
struct LNode*next;
}LNode,*LinkList;
2.单链表头插法
算法思想:1.创建头结点指向空结点;2.循环创建结点p,p->next指针指向L->next;L->next=p->next.
LinkList ListInsertHead(LinkList &L) //LinkList:意味着最终返回LinkList链表; Linklist &L:引用型,意味着:传入的L在函数中发生任何变化都可以传出来
{
int a;
LNode *L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
while(scanf("%d",&a)){
if(a==9999) break;
LNode *p=(LNode*)malloc(sizeof(LNode));
p->data=a;
p->next=L->next;
L->next=p;
}
}
3.单链表尾插法
算法思想:1.创建头结点head;2.循环创建结点q并赋值;3.定义工作指针p指向head并循环创造结点q,p->next=q;p=q;
LinkList ListInserRear(LinkList &L)
{
LNode* L=(LNode*)malloc(sizeof(LNode));
LNode* p=L;
int a;
while(scanf("%d",&a)){
if(a==9999) break;
LNode* q=(LNode*)malloc(sizeof(LNode));
q->data=a;
p->next=q;
p=q;
}
p->next=NULL;
}
4.初始化一个带头结点的单链表
算法思想:1.创建一个头结点并判断是否成功;2.头结点L-next=NLL;
bool InitList(LinkList &L) //因为可能存在空间不足分配失败的可能,所以:返回bool类型变量
{
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL) return false; //空间不足,分配失败
L->next=NULL; //初始化单链表头结点
return true;
}
5.判断带头结点单链表是否为空
算法思想:如果头结点L->next==NLL为真,则:为空;否则,不为空.
bool IsEmpty(LinkList &L) //这里的L可以不带&L,但是带上也不错;以防万一,可以随时一直带着
{ if(L->next==NULL)
return true;
else
return false;
}
6.按序号查找结点值
算法思想:1.定义i=1且p=L->next;2.判断i是否在正常方位内,是否等于0;3.设置循环退出条件,并逐个遍历单链表
LNode * GetElem(LinkList &L,int i)
{
LNode* p=L->next;
if(i<0) return NULL; //判断特殊条件
if(i==0) return L;
while(p && j<i){ //注意:此处应该注意到p可能在j还未遇到i之前,就已经指向空结点的情况;
p=p->next;
j++;
}
return p;
}
7.按值查找链表结点
算法思想:1.传入单链表和目标值;2.在工作指针p不空且p->data!=key的情况下,循环
LNode * GetKey(LinkList &L,int key)
{
LNode* p=L->next; //定义工作指针p
while(p && p->data!=key){
p=p->next;
}
return p;
}
8.递归算法删除不带头结点的单链表L中所有值为x的结点
算法思想:1.判断第一个结点是否为空;(本质:作为递归的一个出口之一)2.判断当前结点值!=目标值,递归判断下一个结点,并设置出口;3.设置结点指针指向递归返回的结点,并删除;4.递归判断后续结点值是否等于目标值;
void DelPoint(LinkList &L,int key) //涉及删除,添加,递归,一定都带上&;
{ if(L==NULL) return; //作为递归的出口之一
if(L->data!=key){ //若当前结点!=key,则递归判断L->next;
DelPoint(L->next,key);
return; //作为递归的出口之一
}
LNode *p=L; //难点:上述递归最后一次进入主函数,在if(L->data!=key)处,不满足条件,则直接来到此处;此时接收到的结点实际上跨过了很多结点或者仅是邻接点
L=L->next;
delete p;
DelPoint(L,key); //寻找下一个key结点,接下来继续递归判断后续结点值是否等于key
}
9.递归算法删除带头结点的单链表L中所有值