我的STL之旅

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
//#include<list>
using namespace std;

//only for int use;
/*
class MyList{
    int *my;
    MyList();
    int back();//返回最后一个元素
    int front();//返回第一个元素
    void clear();//清除所有元素
    bool empty();//是否为空
    void insert(int item); //插入元素
    int pop_back();
    int pop_front();
    void push_back(int item);
    void push_front(int item);
    void sort();
};

MyList::MyList()
{
    my=new int[N];
}
*/
//it‘s a program to packing
//定义结构,单链表
typedef struct MyList{
    int item;
    struct MyList *next;
}MyList,*List;

List head,back;
int *a=new int[10010];

//从尾部插入
void push_back(int item)
{
    List p=head;
    while(p->next!=NULL){
        p=p->next;
    }
    List q=(List)malloc(sizeof(MyList));
    q->item=item;
    q->next=NULL;
    p->next=q;
    back=q;
}

//从头部插入
void push_front(int item)
{
    List p,q;
    p=head;
    q=p->next;
    List in=(List)malloc(sizeof(MyList));
    in->item=item;
    p->next=in;
    in->next=q;
}

//从尾部弹出
int pop_back()
{
    List p,q;
    q=head;
    p=q->next;
    while(p->next!=NULL){
        q=p;
        p=p->next;
    }
    q->next=NULL;
    back=q;
    int item=p->item;
    free(p);
    return item;
}

//从头部弹出
int pop_front()
{
    List p=head;
    List q=p->next;
    int item=q->item;
    p->next=q->next;
    free(q);
    return item;
}

//移除元素值为item的所有节点
int remove(int item)
{
    List p=head;
    List q=p->next;
    int num=0;
    while(q!=NULL){
        if(q->item==item){
            num++;
            p->next=q->next;
            if(p->next==back){
                back=p;
            }
            q=p->next;
        }
        else{
            p=p->next;
            q=p->next;
        }
    }
    return num;
}

//清除所有元素
void clear()
{
    List p=head;
    p=p->next;
    while(p!=NULL){
        List q=p->next;
        int item=p->item;
        free(p);
        p=q;
        cout<<"clear() "<<item<<endl;
    }
    head->next=NULL;
}

//按位置(index)插入item
void insert(int index,int item)
{
    List p;
    p=head;
    List q=p;
    p=p->next;
    int i=0;
    while(p!=NULL){
        i++;
        cout<<"i:"<<i<<endl;
        if(i==index){
            List t=(List)malloc(sizeof(MyList));
            t->item=item;
            q->next=t;
            t->next=p;
            break;
        }

        q=p;
        p=p->next;
    }
    if(i!=index)
        cout<<"你输入的数字错误:please reload:"<<endl;
}

//反转list 通过记录每个节点的值,然后重新赋值
//所以会用到clear()函数 ,及清除原来链表生成新链表
void reverse()
{
    List p=head;
    int i=0;
    while(p->next!=NULL){
        p=p->next;
        int item=p->item;
        a[i++]=item;

    }
    clear();
    p=head;
    cout<<i<<endl;
    for(int j=i-1;j>=0;j--)
    {
        List q=(List)malloc(sizeof(MyList));
        q->item=a[j];
        q->next=NULL;
        p->next=q;
        p=q;
    }
}

//排序list: 通过记录每个节点的值,然后重新对值进行排序
//所以会用到clear()函数 ,及清除原来链表生成新链表
void sort()
{
    List p=head;
    int i=0;
    while(p->next!=NULL){
        p=p->next;
        int item=p->item;
        a[i++]=item;
    }
    clear();
    p=head;
    sort(a,a+i);
    for(int j=0;j<i;j++)
    {
        List q=(List)malloc(sizeof(MyList));
        q->item=a[j];
        q->next=NULL;
        p->next=q;
        p=q;
    }
}

//返回list大小
int size()
{
    List p=head;
    int i=0;
    while(p->next!=NULL){
        p=p->next;
        i++;
    }
    return i;
}

//判断是否为空
bool isEmpty()
{
    if(head->next==NULL)
         return true;
    return false;
}
//for test use
void print()
{
    List p=head;
    while(p->next!=NULL){
        p=p->next;
        cout<<p->item<<" ";
    }
    cout<<endl;
}

int main()
{
    head=(List)malloc(sizeof(MyList));
    back=(List)malloc(sizeof(MyList));
    head->next=NULL;
    back=head;

    push_front(3);
    push_front(2);
    push_back(1);
    push_back(5);
    push_back(1);
    push_back(8);
    push_front(9);
    push_front(6);
    print();
    sort();
    cout<<"after sort()"<<endl;
    print();
    reverse();
    print();
    cout<<"size() "<<size()<<endl;
    insert(7,5);
    print();
    cout<<"remove() "<<remove(1)<<endl;
    print();
    cout<<"pop_back() "<<pop_back()<<endl;
    cout<<"pop_front() "<<pop_front()<<endl;
    print();
    clear();
    print();

    return 0;
}
时间: 2024-08-07 03:08:56

我的STL之旅的相关文章

我的STL之旅 MyStack

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; /* push(int item) int pop() top() 返回stact中的下一个元素 s.top()=12; 设置顶层元素 返回对其引用 */ const int N=10; const int AN=5; int size;//记录大小 int *stack

蓝桥杯 BASIC 28 Huffuman树(STL_Vector)

[思路]:利用vector的动态特性和相关操作很容易实现.可以算第一次真正用STL做题,算开始了我的STL之旅吧. [AC代码]: #include <iostream> #include <algorithm> #include <cstdio> #include <vector> using namespace std; #define MAX 100+10 bool Comp(const int &a,const int &b) { r

【C++探索之旅】开宗明义+第一部分第一课:什么是C++?

内容简介 1.课程大纲 2.第一部分第一课:什么是C++? 3.第一部分第二课预告:C++编程的必要软件 开宗明义 亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的,你不知道如何入门? 别担心,这个系列教程就是为C++初学者准备的. 不可否认,C++是一门非常著名的语言.几乎学计算机的同学都难免要碰一下C++,中国的大学课堂一般也是先学C语言入门,然后就是Java或者C++. C++ 这门语言的使用很广泛,特别是在游戏开发领域,C++的性能和无限可能性使得其几乎

合肥学院ACM集训队第一届暑假友谊赛 B FYZ的求婚之旅 D 计算机科学家 F 智慧码 题解

比赛网址:https://ac.nowcoder.com/acm/contest/994#question B FYZ的求婚之旅 思路: 然后用快速幂即可. 细节见代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack>

【Floyd】文化之旅

[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路

STL学习思想

1.模版:一定要注意参数和返回值的模版 2.STL一系列的API:一定要注意返回值 3.容器中的都是值拷贝,而不是引用,在执行插入时,内部实行拷贝动作,所以STL中插入类时,一般都必须:无参构造函数,拷贝构造函数,重载=运算符,必须的自己重写,达到深拷贝!!! 4.一元谓词:函数只有一个参数,谓词:代表函数的返回值必须为bool类型;   二元谓词:函数只有二个参数,谓词:代表函数的返回值必须为bool类型; 5.算法和具体的数据类型相分离:通过函数对象(仿函数)来实现,本质:函数指针!!! 6

C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用.很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率.这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用. STL共有六大组件: 一.容器(Container):是一种数据结构,如list,vector,deque,queue等,以模板类的方法提供,为了访问容器中的数据,可以使用由容器类提供的迭代器. 二.迭代器(Iterator):提供了访问容器中对象的方法. 三.算法(Al

基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计

自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到很多同行的关注和支持,不过上一篇主要是介绍一个总体的界面效果和思路,本系列的文章将逐步介绍其中的细节,本文主要介绍整个Web开发框架中的MVC控制器的设计.在设计之初,我就希望尽可能的减少代码,提高编程模型的统一性.因此希望能够以基类继承的方式,和我Winform开发框架一样,尽可能通过基类,而不是子类的重复代码来实现各种通用的操作. 1.登录控制的控制器基类设计 我们知道,一般我们创建一个MVC的控制

基于MVC4+EasyUI的Web开发框架形成之旅--权限控制

我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为"用户登录身份验证"."控制器方法权限控制"."界面元素权限控制"三种控制方式,可以为Web开发框架本身提供了很好用户访问控制和权限控制,使得用户界面呈现菜单.Web界面的按钮和内容.Action的提交控制,均能在总体权限功能分配和控制之下. 本篇文章主要细化这三个方面