寒假学习第一二周漏洞

一、sort函数
使用sort,首先头文件:#include
【在c++里要多加一个 using namespace std;
形式:sort(first_pointer,first_pointer+n,cmp)
如果第三个参数不写,是默认为升序函数。
要写cmp的话,就要定义一个cmp,当表示升序时

bool cmp(int a,int b)
{
return a<b;//默认的升序排列
}

当表示降序时

bool cmp(int a,int b)
{
return a>b;//降序排列
}

二、单链表
在有序数组中插入或删除数据且保持有序性时需要移动大量元素,具有较低的效率。由于数组要求在内存中占用连续的存储空。,一方面,当某程序运行部分中需要分配的数组规模较大时,常会出现内存无法满足程序要求的空闲区的情况。另一方面,由于数组在定义时大小固定,当数据量超出数组容量时,不变动态扩展新的存储空间。**采用链表可以有效解决上述问题。**这种结构不要求表中逻辑上相邻的元素占用物理上相邻的存储空间。因此能提高内存空间利用率。

定义单链表

  struct node
{
    int data;//属性域
    struct node *next;//指向下一个节点的指针
    };
    typedef struct node linknode;//类型定义
    typedef linknode *linklist;//结点指针类型定义

接下来,便可用linknode来声明结构体变量,用linklist来声明指向结构体的指针变量。例如:

linklist head=NULL;

在单链表插入新结点
要在单链表中插入值为x的结点,首先要生成结点结构体,我们可以定义指针q来指向新生成的结点空间(q指向结点可简称为结点q)。

linklist q;

生成新结点,并将待插入数据存入结点语句为:

q=(linklist) malloc(sizeof(linknode));//生成新结点
q->data=x;//假设x为带存入数据

下面讨论如何将q指向的结点插入到单链表head中。根据链表状态和插入位置,通常可以分为三种情况:
(1)原单链表head为空表(head=NULL),新加入的结点成为链表的第一个结点。

q->next=head;//此时head==NULL,也可以直接写成q->next=NULL;
head=q;//新节点为链表第一个结点

(2)原链表不为空,新结点q插入在单链表的最前面。此时,应将新插入的结点的next指针指向原链表的第1结点,再将head指向结点q。

q->next=head;//q的下一结点为单链表的第1个结点
head=q;//结点q成为链表的第1个结点

(3)原链表不为空,新结点q插入到链表中由p指向的结点后面。此时,应将q的next指向p的后续结点,同时将p的next指向结点q。

q->next=p->next;//p的后续结点成为q的后续结点
p->next=q;//结点q成为p的后续结点

建立单链表

#include<stdio.h>
#include<stdlib.h>

 struct node
{
    int data;//属性域
    struct node *next;//指向下一个节点的指针
    };
    typedef struct node linknode;//类型定义
    typedef linknode *linklist;//结点指针类型定义
    
    linklist creatLink()
    {
        linklist head,tail,q;
        int x;
        head=tail=NULL;//初始化空链表
        printf("请输入整数序列(以空格分隔,以0做结束):\n");
        scanf("%d",&x);
        while(x!=0)
        {
            q=(linklist)malloc(sizeof(linknode));//形成新结点
            q->data=x;
            if(head==NULL)//原链表为空
                head=tail;
            else         //原链表不为空
            {
                tail->next=q;
            tail=q;//让尾指针后移
                }
                scanf("%d",&x);
        }
        if(tail!=NULL)
            tail->next=NULL;//置链表结束标志
        return head;
    }

单链表的遍历

 void print (linklist head)
    {
        linklist p=head;
        printf("List:\n");
        while(p!=NULL)            //当p未遇到链表结束标志时
        {
            printf("%5d",p_>data);//输出当前结点值
            p=p->next;            //指向下一个结点
        }
        printf("\n");
    }

编写main函数进行测试

 int main()
    {
        linklist head;
        head=creatLink();//建立单链表
        print(head);//输出单链表
        return 0;
    }

查找结点

 linklist searchLink(linklist head,int x)
   {
       linklist p=head;
       while(p!=NULL&&p->data!=x)
        p=p->next;
       return p;
   }

删除结点
在单链表中删除结点需要知道被删除结点前驱结点位置。
(1)被删除节点是单链表的第一个结点。

head=p->next;
free(p);

(2)被删除的结点不是单链表第一个结点。

pre->next=p->next;
free(p);

三、c++的pair用法
pair
①可以将两个数据组合成一组数据,如STL中的map就是将key和value放在一起来保存
②当一个函数需要返回两个数据的时候,可以选择用pair。
pair的实现是一个结构体,主要的两个成员变量是first和second。因为是使用struct不是class,所以可以直接使用pair的成员变量。

pair在#include 头文件中,定义如下:

template<class T1,class T2> struct pair

pair的构造

 
pair<T1, T2> p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);    //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);          // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                    // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;                  // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

pair的初始化

 
pair<string, string> author("James","Joy");    // 创建一个author对象,两个元素类型分别为string类型,并默认初始值为James和Joy。
pair<string, int> name_age2(name_age);    // 拷贝构造初始化
//可改个名字 
typedef pair<string,string> Author;
Author proust("March","Proust");
Author Joy("James","Joy");

T1和T2可以是多种类型。string可,int可,vector< int >也可。

对pair的操作

pair<int, double> p2 = p1; //赋值
//用make_pair创建新的对象
int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);
cout << newone.first << newone.second << endl;
//output: 8 James

四、C++的重载操作符(operator)
operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,扩展运算符的功能只能通过函数的方式实现(实际上,C++中各种“功能”都是由函数实现的)
①将操作符重载实现为类的成员函数;
②操作符重载实现为非类的成员函数(即全局函数)。
就是将一个类进行比较,只比较特定的一个值的时候,就是用operate。

在类体中声明(定义)需要重载的操作符,声明方式跟普通的成员函数一样,只不过操作符重载函数的名字是“关键字 operator +以及紧跟其后的一个C++预定义的操作符”,样式如下(person是我们定义的类):

    bool operator==(const person& ps)
    {
        if (this->age == ps.age)
        {
            return true;
        }
        return false;
    }

就是类似这样子,贪心题目里面运用了许多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值