类、结构体、指针
1、类的定义
class Person
{
private:
int age,height;
double money;
string books[100];
public:
string name;
void say()
{
cout<<"I'm"<<name;
}
int get_age()
{
return age;
}
void add_money(double x)
{
money+=x;
}
}
类中的变量和函数被统一称为类的成员变量。
private后面的内容是私有成员变量,在类的外部不能访问;public后面的内容是公有成员变量,在类的外部可以访问。
类的使用:
#include <iostream>
using namespace std;
const int N = 1000010;
class Person
{
private:
int age,height;
double money;
string books[100];
public:
string name;
void say()
{
cout<<"I'm"<<name<<" ";
}
int set_age(int a)
{
age = a;
}
int get_age()
{
return age;
}
void add_money(double x)
{
money += x;
}
} Person_a,person_b,persons[100];
int main()
{
Person c;
c.name = "yxc";
c.age = 18;
c.set_age(18);
c.add_money(100);
c.say();
cout<<c.get_age()<<endl;
return 0;
}
结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public。
struct Person
{
private:
int age,height;
double money;
string books[100];
public:
string name;
void say()
{
cout<<"I'm"<<" ";
}
int set_age(int a)
{
age = a;
}
int get_age()
{
return age;
}
void add_money(double x)
{
money += x;
}
}Person_a,person_b,Persons[100];
2、指针和引用
指针指向存放变量的值的地址。因此我们可以通过指针来修改变量的值。
#include <iostream>
using namespace std;
int main()
{
int a=10;
int *p = &a;
*p += 5;
cout<<a<<endl;
return 0;
}
数组名是一种特殊的指针。指针可以做运算:
#include <iostream>
using namespace std;
int main()
{
int a[5] = {1, 2, 3, 4, 5};
for(int i = 0;i < 5;i ++)
cout<<*(a+i)<<endl;
return 0;
}
引用和指针相似,相当于给变量起了个别名。
#includ <iostream>
using namespace std;
int main()
{
int a = 10;
int &p = a;
p += 5;
cout << a << endl;
return 0;
}
3、链表
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node*next;
};
void sc(Node*head)
{
if(nullptr==head->next)
{
return;
}
while(head!=nullptr)
{
cout<<head->val<<" ";
head=head->next;
}
}
int main()
{
Node*n0= new Node;
Node*n1= new Node;
Node*n2= new Node;
n0->val=0;
n1->val=1;
n2->val=2;
n0->next=n1;
n1->next=n2;
n2->next=nullptr;
sc(n0);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node* next;
}*head;
int main()
{
for(int i=1;i<=5;i++)
{
Node* p = new Node;
p -> val = i;
p -> next = head;
head = p;
}
for(Node* p = head; p; p=p->next)
{
cout<<p->val<<" ";
}
return 0;
}
4、删除链表的节点
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node* next;
}*head;
void Delete(int n)
{
Node* temp1 = head;
if(n==1)
{
head = temp1->next ;
delete temp1;
return;
}
for(int i=1;i<n-1;i++)
{
temp1 = temp1->next;
}
Node* temp2 = temp1->next;
temp1->next = temp2->next;
delete temp2;
}
int main()
{
for(int n=1;n<=5;n++)
{
Node* p=new Node;
p->val=n;
p->next=head;
head=p;
}
Delete(3);
for(Node* p=head;p;p=p->next)
{
cout<<p->val<<" ";
}
return 0;
}
5、链表的插入
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node* next;
}* head;
void Delete(int n)
{
Node* temp1=head;
if(n==1)
{
head=temp1->next;
delete temp1;
return;
}
for(int i=0;i<n-1;i++)
{
temp1=temp1->next;
}
Node* temp2 = temp1->next;
temp1->next=temp2->next;
delete temp2;
}
void Insert(int val,int n)
{
Node* temp1 = new Node;
temp1->val = val;
temp1->next = nullptr;
if(n==1)
{
temp1->next=head;
head=temp1;
return;
}
Node* temp2=head;
for(int i=1;i<n-1;i++)
{
temp2=temp2->next;
}
temp1->next=temp2->next;
temp2->next = temp1;
}
int main()
{
for(int n=1;n<=5;n++)
{
Node* p=new Node;
p->val=n;
p->next=head;
head=p;
}
Insert(100,1);
for(Node* p=head;p;p=p->next)
{
cout<<p->val<<" ";
}
return 0;
}
6、反转列表
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node* next;
}* head;
void Fz()
{
Node* prev = NULL;
Node* curr = head;
Node* next;
while(curr!=NULL)
{
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head = prev;
}
int main()
{
for(int n = 1;n <= 5;n++)
{
Node* p = new Node();
p->val = n;
p->next = head;
head = p;
}
Fz();
for(Node* p = head;p;p = p->next)
{
cout<<p->val<<" ";
}
return 0;
}
双向链表
1、定义双向链表
struct Double_Node
{
int val;
struct Double_Node* next;
struct Double_Node* prev;
}* head;
2、for循环建立双向链表
for(int i = 1; i<=5; i ++)
{
Double_Node* p = new Double_Node();
p->val = i;
p->next = head;
head = p;
if(i!=1)
{
head->next->prev=p;
}
}
3、双向链表删除第n个节点
void Delete(int n) //5
{
Double_Node* temp1 = head;
if(n == 1)
{
head = temp1->next;
head->prev = NULL;
delete temp1;
return;
}
for(int i = 1;i < n-1;i++)
{
temp1 = temp1->next;
}
Double_Node* temp2 = temp1->next; //temp1=4,temp2=5
if(temp2->next != NULL)
{
temp1->next = temp2->next; //
temp1->next->prev = temp1; //
}
else
{
temp1->next = NULL;
}
delete temp2;
return;
}
4、双向链表插入的n个节点
void Insert(int val,int n)
{
Double_Node* temp1 = new Double_Node();
temp1->val = val;
temp1->next = NULL;
temp1->prev = NULL;
if(n == 1)
{
temp1->next = head;
head = temp1;
temp1->next->prev = temp1;
return;
}
Double_Node* temp2 = head;
for(int i = 1; i < n-1;i ++)
{
temp2 = temp2->next;
}
temp1->next = temp2->next;
temp2->next = temp1;
temp1->prev = temp2;
temp2->next->prev = temp1;
}

浙公网安备 33010602011771号