数据结构-单链表

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中所有值

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值