带头节点的单链表的各种操作

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
    int data;
    struct LNode *next; 
}LNode,*LinkList; 

//初始化链表 
LinkList create(LinkList &l){
    l=(LinkList)malloc(sizeof(LNode));
    l->next=NULL;
    int k; LNode *p;
    p=l;
    printf("请输入数字\n");
    scanf("%d",&k);
    //LNode *newnode; 
    while(k!=9999){
         LNode *newnode=(LNode*)malloc(sizeof(LNode));
        newnode->data=k;
        newnode->next=NULL;
        p->next=newnode;
        p=newnode;
        printf("请输入数字\n");
        scanf("%d",&k);
    }
    p->next=NULL;
    return l;
}
//遍历链表
void display(LinkList l){
    LNode *node=l->next;
    while(node!=NULL){
        printf("%d\n",node->data);
        node=node->next;
    }
}
//按值查找 
LNode *search1(LinkList l,int i){
    LNode *node=l->next;
    while(node!=NULL&&node->data!=i){
        node=node->next;
    }
    return node;
}

//按序号查找 
LNode *search2(LinkList l,int i){
    int j=1;
    LNode *node=l->next;
    while(node!=NULL&&j<i){
        node=node->next;
         j++;
    }
    return node;

}
//前插操作 
LinkList insertbefore(LinkList &l,int k,int num){
    LNode *newnode=(LNode*)malloc(sizeof(LNode));
    newnode->data=k;
    newnode->next=NULL;
    //LNode *node=l->next; 
    LNode *p=search2(l,num-1);//在这个结点后面插入
    newnode->next=p->next;
    p->next=p;
    return l;
     
    
}
//后插操作
LinkList insertafter(LinkList &l,int k,int num){
    LNode *newnode=(LNode*)malloc(sizeof(LNode));
    newnode->data=k;
    newnode->next=NULL;
    //LNode *node=l->next; 
    LNode *p=search2(l,num-1);//在这个结点后面插入
    newnode->next=p->next;
    p->next=p;
    return l;
     
    
}


//按照值进行删除操作 
void delete1(LinkList l,int i){
    LNode *node=l->next;
    LNode *pre=l;
    while(node!=NULL&&node->data!=i){
        pre=node;
        node=node->next;
    }
    pre->next=node->next;
    free(node);
    
}
//按序号删除操作
void delete2(LinkList l,int i){
    LNode *node=search2(l,i-1);
    LNode *p=node->next;
    node->next=p->next;
    free(p);
    

//删除所有值为x的结点
void delete3(LinkList l,int x){
    LNode *node=l->next;
    LNode *pre=l;
    while(node!=NULL){
        if(node->data==x){
            LNode *deletenode=node;
            pre->next=node->next;
            node=node->next;
            free(deletenode);
        }else{
           pre=node;
           node=node->next;
        }
        
    }


//从尾到头反向输出(栈的思想)
void opposedisplay(LinkList l){
     //LNode *node=l->next;
     if(l->next!=NULL){
         opposedisplay(l->next);
     } 
     printf("%d\n",l->data); 


//删除最小值结点
void deletemin(LinkList l){
     LNode *node=l->next;
     int min=node->data;
    LNode *minnode=l->next;     LNode *minpre=l; LNode *pre=l;
     while(node!=NULL){
         if(node->data<min){
             min=node->data;
             minnode=node;
             minpre=pre;
             pre=node;
             node=node->next;
         }else{
             pre=node;
             node=node->next;
         }
     }
     
     minpre->next=minnode->next;
     free(minnode);
     //printf("%d\n",l->data); 
}
//将整个链表逆置(需要加强复习)
LinkList oppose(LinkList l){
    //LNode *node=l->next;
    LNode *p=l->next;LNode *r;
    l->next=NULL;
    while(p!=NULL){
        r=p->next;
        p->next=l->next;
        l->next=p;
        p=r;
    }
    return l;
}

//将整个链表有序递增   可以将值放到数组之中(需要加强复习)  
LinkList increase(LinkList l){
    LNode *node=l->next;
    LNode *pre;
    LNode *r=node->next;
    node->next=NULL;
    node=r;
    while(node!=NULL){
        r=node->next;
        pre=l;
        while(pre->next!=NULL&&pre->next->data<node->data)
          pre=pre->next;
        node->next=pre->next;
        pre->next=node;
        node=r;
        
    }
    
    

//删除值在a到b之间的结点 
void deletebetween(LinkList l,int a,int b){
    LNode *node=l->next;
    LNode *pre=l;
    while(node!=NULL){
        if(l->data>a&&l->data<b){
            LNode *p=node;
            pre->next=node->next;
            node=node->next;
            free(p);
        }else{
            pre=node;
            node=node->next;
        }
    }    

//递增次序输出各节点元素(不允许用数组) (找最大值然后释放元素)
void displayincreasse(LinkList l){
    

//两个链表递增,归并为一个递减的单链表
LinkList combine(LinkList &l,LinkList &l1,LinkList &l2){
    //LinkList l=(LinkList)malloc(sizeof(LNode));
    l=(LinkList)malloc(sizeof(LNode));
    l->next=NULL;
    LNode *p1=l1->next;
    LNode *p2=l2->next;
    LNode *r;
    while(p1!=NULL&&p2!=NULL){
        //LNode *node=l->next;
        printf("p1的数值是%d,p2的数值是%d",p1->data,p2->data);
        if(p1->data<p2->data){
            r=p1->next;
            p1->next=l->next;
            l->next=p1;
            p1=r;
            printf("进来此处%d\n",l->next->data);         
        }else{
            r=p2->next;
            p2->next=l->next;
            l->next=p2;
            p2=r;
            printf("进来z这里%d\n",l->next->data);     
        }
    } 
    //LNode *node2=l->next;
    if(p1!=NULL){
        while(p1!=NULL){
            r=p1->next;
            p1->next=l->next;
            l->next=p1;
            p1=r;
        }
    }else{
        while(p2!=NULL){
            r=p2->next;
            p2->next=l->next;
            l->next=p2;
            p2=r;
        }
    }
    return l;


int main(){
    LinkList l,l1,l2;
    //create(l);
    //deletemin(l);
    //oppose(l);
    l1=create(l1);
    display(l1);
    l2=create(l2);
    display(l2);
    l=combine(l, l1, l2);
    display(l);
    //increase(l);
    
    
    //LNode *p1=search1(l,23);
    //printf("%d\n",p1->data);
    //LNode *p2=search2(l,2);
    //printf("第二个值是%d\n",p2->data);
    //opposedisplay(l);
    //delete3(l,23);
    //display(l);
    //delete2(l,3);
    //display(l);
    return 1; 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值