栈与队列的实现

//顺序栈 top指向栈顶元素的下一个位置
    int stk[10],top=0;
    //插入
    stk[top++]=1; //先赋值 再加一 
    //删除
    top--;
    //返回栈顶
    skt[top-1];
    //判断栈是否为空
    top==0;
    
    
    //链栈 top指向栈顶元素
    //插入
    Node *top=NULL;
    auto a=new Node();
    a->next=top;
    top=a;
    auto b=new Node();
    b->next=top;
    top=b;
    //删除
    top=top->next;
    //取栈顶元素
    top->data;
//顺序队列(循环) 头指针指向队头  尾指针指向队尾元素的下一个位置
    int q[N],front=0,rear=0;
    //队列为空
    front==rear;
    //队列满
    front=(rear+1)%N;
    //插入
    q[rear++]=a;//先赋值 后加1
    rear%N;
    //删除队头
    front=(front+1)%N;
    //返回队头
    q[front];
    
    //链队   front 指向队头的前一个元素 rear指向队尾
    Node *front=new Node(),*rear=front;
    //插入
    rear->data=1;
    rear->next=new Node();
    rear=rear->next;
    //删除队头
    auto p=front();
    front=front->next;
    delete p;
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
void print(LNode *L){
    for(LNode *p=L;p!=NULL;p=p->next){
        cout << p->data << " ";
    }
    cout << endl;
}
int main(){
    LinkList L=new LNode;
    L->next=NULL;
    L->data=1;
    print(L);
    //尾插法
    LinkList a=new LNode;
    a->next=NULL;
    a->data=2;
    L->next=a;
    print(L);
    LinkList b=new LNode;
    b->next=NULL;
    b->data=3;
    a->next=b;
    print(L);
    //头插法  
    LinkList c=new LNode;
    c->next=NULL;
    c->data=4;
    c->next=L->next;  
    L->next=c;
    print(L);
    //删除中间节点
    c->next=c->next->next;
    free(a);
    print(L);
    //删除头结点
    LNode *p=L;  // 为什么要构造一个P  直接L=L->next 不是也能删除吗
    L=L->next;   // 构造一个P是因为要释放原来的头结点的那个空间
    free(p);
    print(L);
    return 0;
}
//链表一到八题代码
void One(List &a,List &b,List &c){
    pa=a->next;
    pb=b->next;
    pc=c=pa;
    while(pa&&pb){
        if(pa->data>pb->data){
            pc->next=pb;
            pc=pc->next;
            pb=pb->next;
        }
        else if(pa->data<pb->data){
            pc->next=pa;
            pc=pc->next;
            pa=pa->next;
        }
        else {
            pc->next=pa;
            pc=pc->next;
            u=pb;
            pa=pa->next;
            pb=pb->next;
            free(u);
        }
    }
    while(pa) {
        pc->next=pa;
        pc=pc->next;
        pa=pa->next;
    }
    while(pb) {
        pc->next=pb;
        pc=pc->next;
        pb=pb->next;
    }
    free(pb);
}
void Two(List &a,List &b,List &c){
    pa=a->next;
    pb=b->next;
    c=pc=a;  
    c->next=NULL;
    while(pa&&pb){
        if(pa->data<=pb->data){
            u=pa;
            u->next=c->next;     //头插法操作的是头结点
            c->next=u;
            pa=pa->next;
        }
        else if(pa->data>pb->data){
            u=pb;
            u->next=c->next;
            c->next=u;
            pb=pb->next;
        }
    }
    while(pa) {
        u=pa;
        u->next=c->next;
        c->next=u;
        pa=pa->next;
    }
    while(pb){
        u=pb;
        u->next=c->next;
        c->next=u;
        pb=pb->next;
    }
    free(b);
}
void Three(List &a,List &b,List &c){
    pa=a->next;
    pb=b->next;
    c=pc=a;
    while(pa&&pb){
        if(pa->data>pb->data){
            u=pb;
            pb=pb->next;
            free(u);
        }
        else if(pa->data<pb->data){ // 这特么a里面没用到的点也得删除
            u=pa;
            pa=pa->next;
            free(u);
        }
        else {
            u=pb;
            pc->next=pa;
            pc=pc->next;
            pa=pa->next;
            pb=pb->next;
            free(u);
        }
    }
    while(pa){  // 这他妈也要删除
        u=pa;
        pa=pa->next;
        free(u);
    }
    while(pb){
        u=pb;
        pb=pb->next;
        free(u);
    }
    pc->next=NULL;
    free(b);
}
void Four(List &a,List &b,List &c){  //这题为啥不释放B链表的节点了?
    pa=a->next;
    pb=b->next;
    pre=a;//注意这一题不用开新表,只用操作A表,pre用来方便删除A中的节点
    int n=0;
    while(pa&&pb){
        if(pa->data==pb->data){
            pre->next=pa->next;
            u=pa;
            pa=pa->next;
            pb=pb->next;
            free(u);
        }
        if(pa->data>pb->data){
            pb=pb->next;
        }
        else {
            n++;
            pre=pa;
            pa=pa->next;
        }
    }
    while(pa){
        n++;
        pa=pa->next;
    }
    while(pb){
        u=pb;
        pb=pb->next;
        free(u);
    }
    free(b);
}
void Five(List &a){
    b=pb=a;
    pa=a->next;
    c=new List();
    pc=c;
    c->next=NULL;
    while(pa){
        if(pa->data<0){
            pb->next=pa;
            pb=pb->next;
            pa=pa->next;
        }
        else {
            pc->next=pa;
            pc=pc->next;
            pa=pa->next;
        }
    }
}
void six(List a){
    pmax=a->next;
    pa=a->next;
    while(pa){
        if(pa->data>pmax->data){
            pmax=pa;
        }
        pa=pa->next;
    }
    return pmax->data;
}
void seven(List &a){
    pa=a->next;
    pc=c=a;
    c->next=NULL;
    while(pa){
        u=pa;
        pa=pa->next;
        u->next=c->next;
        c->next=u;
    }
}
void eight(List &a,int mink,int maxk){
    pa=a->next;
    pre=a;
    while(pa){
        if(pa->data>mink&&pa->data<maxk){
            pre->next=pa->next;
            u=pa;
            pa=pa->next;
            delete u;
        }
        else pa=pa->next;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值