单链表的基本操作

来源:互联网 发布:如何制作淘宝首页模板 编辑:程序博客网 时间:2024/06/06 11:38

一些单链表的基本操作,具体的都在注释里,直接主函数调用即可

#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;typedef struct LNode{    int data;    struct LNode *next;}LNode,*LinkList;void Create_List_Head(LinkList &L){             //带头结点的链表    int data;    LNode *p,*q;    L=(LinkList)malloc(sizeof(LNode));    L->next=NULL;    q=L;    scanf("%d",&data);    while(data!=0){        p=(LinkList)malloc(sizeof(LNode));        p->data=data;        q->next=p;        q=p;        scanf("%d",&data);    }    q->next=NULL;}void Create_List(LinkList &L){                  //不带头结点的链表    int data;    LNode *p,*q;    L=(LinkList)malloc(sizeof(LNode));    L=NULL;    while(scanf("%d",&data)&&data){        q=(LinkList)malloc(sizeof(LNode));        q->data=data;        if(L==NULL){            L=q;            p=q;        }        else{            p->next=q;            p=q;        }    }    p->next=NULL;}void print(LinkList L){                         //打印不带头结点链表    LNode *p;    p=L;    while(p!=NULL){        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void print_Head(LinkList L){                    //打印带头节点链表    LNode *p;    p=L->next;    while(p!=NULL){        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void del_x(LinkList &L,int x){                  //不带头结点,删除值为x的节点    LNode *p;    if(L==NULL)    return ;    if(L->data==x){        p=L;        L=L->next;        free(p);        del_x(L,x);    }    else    del_x(L->next,x);}void del_Head(LinkList &L,int x){               //带头结点,删除值为x的元素    LNode *p;    if(L->next==NULL)    return;    if(L->next->data==x){        p=L->next;        L->next=p->next;        free(p);        del_Head(L,x);    }    else    del_Head(L->next,x);}void reverse_print(LinkList L){                 //逆序输出    if(L->next==NULL)    return;    reverse_print(L->next);    printf("%d ",L->next->data);}void del_min(LinkList &L){                      //删除唯一最小值    LNode *pre=L,*p=L->next;    LNode *minpre=L,*minp=p;    while(p!=NULL){        if(p->data<minp->data){            minp=p;            minpre=pre;        }        pre=p,p=p->next;    }    minpre->next=minp->next;    free(minp);}void rev(LinkList &L){                          //链表反转    LNode *p,*q;    p=L->next;    L->next=NULL;    while(p!=NULL){        q=p->next;        p->next=L->next;        L->next=p;        p=q;    }}void Sort(LinkList &L){                         //链表排序    LNode *p,*r,*pre;    p=L->next;    r=p->next;    p->next=NULL;    p=r;    while(p!=NULL){        r=p->next;        pre=L;        while(pre->next!=NULL&&pre->next->data<p->data)        pre=pre->next;        p->next=pre->next;        pre->next=p;        p=r;    }}void del_lr(LinkList &L,int l,int r){           //删除值在[l,r]之间的节点    LNode *p;    if(L->next==NULL)    return;    p=L->next;    if(p->data>=l&&p->data<=r){        L->next=p->next;        free(p);        del_lr(L,l,r);    }    else    del_lr(L->next,l,r);}void create_two(LinkList L,LinkList &A,LinkList &B){    A=(LinkList)malloc(sizeof(LNode));          //按标号奇偶拆成两个链表    B=(LinkList)malloc(sizeof(LNode));    int op=1;    LNode *r,*ra,*rb;    r=L->next;    A->next=NULL,ra=A;    B->next=NULL,rb=B;    while(r!=NULL){        if(op%2){            ra->next=r;            ra=ra->next;        }        else{            rb->next=r;            rb=rb->next;        }        op++;        r=r->next;    }    ra->next=NULL;    rb->next=NULL;}void union_head(LinkList &L){                   //递增链表去重    LNode *p,*q;    if(L==NULL)    return;    p=L->next;    if(p->next!=NULL){        q=p->next;        if(q->data==p->data){            p->next=q->next;            free(q);            union_head(L);        }        else        union_head(p);    }}void mergelist(LinkList &A,LinkList &B){        //两个递增的链表A,B,合并成一个递减的链表A    LNode *r,*ra,*rb;    ra=A->next;    rb=B->next;    A->next=NULL;    while(ra&&rb){        if(ra->data<rb->data){            r=ra->next;            ra->next=A->next;            A->next=ra;            ra=r;        }        else{            r=rb->next;            rb->next=A->next;            A->next=rb;            rb=r;        }    }    if(rb)    ra=rb;    while(ra){        r=ra->next;        ra->next=A->next;        A->next=ra;        ra=r;    }    free(B);}LinkList mergesame(LinkList &A,LinkList &B){    //用A,B中相同元素建立链表C,且不破坏A,B    LNode *c,*r,*s,*ra,*rb;    c=(LinkList)malloc(sizeof(LNode));    r=c;    ra=A->next;    rb=B->next;    while(ra&&rb){        if(ra->data<rb->data)        ra=ra->next;        else if(ra->data>rb->data)        rb=rb->next;        else{            s=(LinkList)malloc(sizeof(LNode));            s->data=ra->data;            r->next=s;            r=r->next;            ra=ra->next;            rb=rb->next;        }    }    r->next=NULL;    return c;}void uniontoA(LinkList &A,LinkList &B){         //A,B递增,将A,B交集存入A中    LNode *r,*p,*ra,*rb;    ra=A->next;    rb=B->next;    r=A;    while(ra&&rb){        if(ra->data<rb->data){            p=ra;            ra=ra->next;            free(p);        }        else if(ra->data>rb->data){            p=rb;            rb=rb->next;            free(p);        }        else{            r->next=ra;            r=r->next;            p=rb;            ra=ra->next;            rb=rb->next;            free(p);        }    }    r->next=NULL;    while(ra){        p=ra;        ra=ra->next;        free(p);    }    while(rb){        p=rb;        rb=rb->next;        free(p);    }    free(B);}void kmp(LinkList &A,LinkList &B){              //判断B是否为A的子序列    LNode *ra,*rb,*st;    st=A->next;    ra=A->next;    rb=B->next;    while(st){        if(ra->data==rb->data){            ra=ra->next;            rb=rb->next;            if(rb==NULL){                puts("yes");                return;            }        }        else{            st=st->next;            ra=st;            rb=B->next;        }    }    puts("no");    return;}int main(){    LinkList L,A,B,C;    return 0;}