类、结构体、指针

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;
}
posted @ 2024-10-18 20:45  yanxinyi123  阅读(40)  评论(0)    收藏  举报