无空头链表


链表的相关函数


//头尾指针
struct node *phead=NULL;
struct node *pend=NULL;

//遍历链表
void scanlist();

//尾添加
void wtj(int a);

//头添加
void  ttj(int a);

//指定位置添加数据
void tianjiashuju(int b,int a);

//指定 查询 链表
struct node * zhilist(int b);

//头删除
void  tsc();

//尾删除
void  wsc();

//删除指定节点
void sczdjd(int c);

//栈  头添加+头删除

//队列 头添加+尾删除   尾添加+头删除


代码块

//**创建链表,在链表中创建一个数据  头添加**
void  ttj(int a){
     //创建一个节点
    struct node *pt=(struct node *)malloc(sizeof(struct node));
    
    //节点赋值
    pt->a=a;
    pt->pnext=NULL;
    
     //链接
    if(NULL==phead){
        //链表没有 东西的时候即是头也是尾 
        phead =pt;
        pend=phead;
        
    }else{
      pt->pnext=phead;
        phead=pt;
    }
  
 
}
//指定 查询 链表
struct node * zhilist(int b){
    struct node *pt=phead;
    while(pt!=NULL){
        if(pt->a==b){
           return pt;
            
        }
        printf("%d\n",pt->a);
        pt=pt->pnext;
        
    }
    return NULL;
}
//指定位置添加数据
void tianjiashuju(int b,int a){
    
    //链表为空
    if (NULL == phead){
        printf("链表没有节点\n");
        return;
    }
    struct node *pt=zhilist(b);
    if(NULL==pt){
        printf("没有指定节点");
        return ;
    }
    //有此节点
    //给a创建节点
    struct node *ptem=(struct node *)malloc(sizeof(struct node));
    //节点成员赋值
    ptem->a=a;
    ptem->pnext=NULL;
    //链接到链表上
    if(pt==pend){
        pend->pnext=ptem;
        pend=ptem;
        
    }else{
        
    }
    ptem->pnext=pt->pnext;
    pt->pnext=ptem;
}

//遍历链表  查
void scanlist(){
    struct node *pt=phead;
    while(pt!=NULL){
        printf("%d",pt->a);
        pt=pt->pnext;
        
    }
    printf("\n");
}

//创建链表,在链表中创建一个数据  尾添加
void wtj(int a){
    //创建一个节点
    struct node *pt=(struct node *)malloc(sizeof(struct node));
    
    //节点赋值
    pt->a=a;
    pt->pnext=NULL;
    
    //链接
    if(NULL==phead){
        //链表没有 东西的时候即是头也是尾 
        phead =pt;
        pend=pt;
        
    }else{
        //不为空 往头上去添加
        pend->pnext=pt;
        //头一直指向一个节点
        pend=pt;
    }
    
   
}
//释放链表
void ffree(){
    
    //记录头,防止头被修改 丢内存
    struct node *pt=phead;
    while(pt!=NULL){
        
        struct node *pu=pt;
        
        
        pt=pt->pnext;
        free(pu);
    }
    //头尾清空,方便下次使用
   phead=NULL;
  pend=NULL;
}

//头删除
void  tsc(){
    //链表检测
    if(NULL==phead){
        printf("链表为空,无需释放\n");
        return;
    }
    //记住旧的头
    struct node *pm=phead;
    //头的下一个节点变成头
    phead=phead->pnext;
    free(pm);
}
//尾删除
void  wsc(){
    //链表检测
    if(NULL==phead){
        printf("链表为空,无需释放\n");
        return;//结束
    }
    //链表不为空
    //链表有一个节点
    if(phead==pend){
        free(phead);
        phead=NULL;
        pend=NULL;
    }
    else{
        //找尾巴前一个节点,用遍历方法
        //遍历从头开始
        struct node *ptm=phead;
        while(ptm->pnext!=pend){
            ptm=ptm->pnext;
            
        }
        //找到了,删除尾巴
        //先释放尾巴
        free(pend);
        //使之尾巴前一个节点成为最后一个
        pend=ptm;
        //尾巴的下一个赋值为空
        pend->pnext=NULL;
    }
}

//删除指定节点
void sczdjd(int b){
    //链表判断
     //链表检测
         if(NULL==phead){
        printf("链表为空,无需释放\n");
        return;//结束
    }
    
     struct node *pt=zhilist(b);
    if(NULL==pt){
        printf("查无此节点\n");
        return;//结束
    }
    //找到了
    //只有一个节点
    if(phead==pend){
        
        free(phead);
        phead=NULL;
        pend=NULL;
        
    }
    //只有两个的时候
    else if(phead->pnext=pend){
        if(phead==pt){
            tsc();
        }
        else{
            
            wsc();
        }
        
    }
    //多个节点的时候
    else{
        
        if(phead==pt){
            
             tsc();
        }else if(pend==pt){
            
            wsc();
        }
        else{
        
        //找尾巴前一个节点,用遍历方法
        //遍历从头开始
        struct node *ptm=phead;
        while(ptm->pnext!=pend){
            ptm=ptm->pnext;
            
        }
        //z找到了
         ptm->pnext = pt->pnext;
         //释放链表
         free(pt);
            
             }
            
           
        }
        
    }
 

int main()
{
    
    int i=0;
     phead;
    int a[10]={1,2,3,4,5,6,7};
    
    for(i=0;i<7;i++){
    
   ttj(a[i]);
  
    }
    //tianjiashuju(4,14);
      /*struct node *find=zhilist(5);
      if(find!=NULL){
          printf("找到了%d\n",find->a);
          
      }else{
          printf("没有找到\n");
      }
      
      ffree();
      for(i=0;i<7;i++){
    
   ttj(a[i]);
  
    }
      */
      
    scanlist();
    
  sczdjd(8);
  
  
    scanlist();
    //释放链表
    ffree();
    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值