线性表——链表删除

王道链表题1-4

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

typedef int Elemtype;
//定义单链表
typedef struct Lnode{
    Elemtype data;
    struct Lnode *next;
}Lnode,*Linklist;
int a[4]={1,2,3,4};
int n=4;

//建立不带头节点的链表
void buildlist(Lnode *L){
    Lnode *s,*r=L;
    r->data=a[0];
    if(n==1)r->next=NULL;
    else for(int i=1;i<n;i++){
        s=(Lnode*)malloc(sizeof(Lnode));
        s->data=a[i];
        r->next=s;
        r=r->next;
    }
    L=(Linklist)malloc(sizeof(Lnode));
    L->next=NULL;
    
}


//头插法建立单链表
Linklist list_headinsert(Linklist &L){
    Lnode *s;
    int x;
    L=(Linklist)malloc(sizeof(Lnode));
    L->next=NULL;
    scanf("%d",&x);
    while(x!=9999){
        s=(Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
/**
 *
 * 
 * 
**/


//尾插法建立单链表
Linklist List_TailInsert(Linklist &L){
    int x;
    L=(Linklist)malloc(sizeof(Linklist));
    Lnode *s,*r=L;
    scanf("%d",&x);
    while(x!=9999){
        s=(Lnode*)malloc(sizeof(Lnode));
        s->data=x;
       //和头插法不同
       r->next=s;
       r=s;
       //
        scanf("%d",&x);
    }
    r->next=NULL;
    return L;
}




void disp(Lnode *L){
    Lnode *s=L;
    while(s){
        cout<<(s->data)<<" ";
        s=s->next;
    }
    
    cout<<endl;
}



void deletex(Lnode *&L,int x){
    
    if(L==NULL)return;
    Lnode *p;
    if(L->data=x){
        p=L;
        L=L->next;
        free(p);
        deletex(L,x);
        
    }
    else
    deletex(L->next,x);
    
}

//用p从头到尾扫描链表,pre指向p的前驱,如果p=x,则将p删除
void del_x_1(Linklist &L,Elemtype x){
    Lnode *p=L->next,*pre=L,*q;//初始化p和pre
    
    while(p!=NULL){
        if(p->data==x){
            q=p;
            p=p->next;
            pre->next=p;
            free(q);
        }
        else{
            pre=p;
            p=p->next;
        }
    }
}
//使用从头到尾反向输出链表
//递归
void R_Print(Lnode *&L){
    Lnode *p=L;
    if(p!=NULL){
        R_Print(L->next);
        printf("%d ",p->data);
    }
}

//删除值最小节点(唯一)
void del_min(Linklist &L){
    Lnode *pre=L,*p=L->next,*q=L->next;
    while(q!=NULL){
        if((q->data)<(p->next->data)){
            p=pre;
            pre=q;
            q=q->next;
        }
        else{
            pre=q;
            q=q->next;
        }
    }
    q=p->next;
    p->next=p->next->next;
    free(q);
}

/**
int main() {
    Lnode list;
    Lnode *L=&list;
    buildlist(L);
    disp(L);

    return 0;
}
    
    
    
int main() {
    Lnode list;
    Lnode *L=&list;
    List_TailInsert(L);
    del_x_1(L,1);
    disp(L);
    return 0;
}



 
 int main() {
    Lnode list;
    Lnode *L=&list;
    List_TailInsert(L);
    R_Print(L);
    return 0;
}

 **/
 
 
 int main() {
    Lnode list;
    Lnode *L=&list;
    List_TailInsert(L);
    del_min(L);
    disp(L);
    return 0;
}

上一篇:链表的构造、清空、销毁、删除和插入


下一篇:数据结构基础(C语言)--链序表