结构体指针

结构体指针的定义和操作

struct 结构体类型名
{
	成员表;
	成员函数; 
 } 结构体指针变量表; 
 
 struct student
 {
 	string name;
 	int chinese,math,total;
  }  stu1;
  
  struct 结构体类型名
  {
  	成员表;
	成员函数; 
   }; 
结构体名 结构体指针变量表;

struct student
{
	string name;
	int chinese,math,total;
 };
 student *stu;
 

 结构体指针变量的值是指向的结构体变量的起始地址。结构体指针同样要赋值以后才能使用。

赋值是把结构体的首地址赋予该指针变量,不能把结构名赋予该指针变量

结构体指针的引用

1、指针名->成员名

2、(*指针名).成员名

例如:

(*stu1).chinese与stu1->chinese是等价的

自引用结构体

当一个结构体中有一个或者多个成员是指针,他们所指向的类型就是本结构体类型时,通常这种结构体称为“ 引用自身的结构体”,即“自引用结构”

//不合法的 
stuct stu
 {
 	char name[20];
 	int age,score;
 	stu p;
 };
//合法的
 stuct stu
 {
 	char name[20];
 	int age,score;
 	stu *p;
 };
 

 单链表的结构、建立、输出

由于单链表的每个结点都有一个数据域和一个指针域,所以每个结点都可以定义成一个结构

 
 struct Node
 {
 	int data;
 	Node *next;
 };
 Node *p;
 p=new Node;

 单链表的建立

#include <iostream>
 using namespace std;
 struct Node
 {
 	int date;
 	Node *next;
 };
 Node *head,*p,*r;//*p *r不断变化
 int x;
 int main()
 {
 	cin>>x;
 	head=new Node;//申请头结点 
 	r=head;
 	while(x!=-1)
 	{
 		p=new Node;
 		p->date=x;
 		p->next=NULL;
 		r->next=p;//把新结点连接到前面的链表中
		r=p;
		cin>>x; 
	 }
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
 	return 0;
 }
 

单链表的查找

#include <iostream>
 using namespace std;
 struct Node
 {
 	int date;
 	Node *next;
 };
 Node *head,*p,*r;
 int x;
 
 int main()
 {
 	cin>>x;
 	head=new Node;//申请头结点 
 	r=head;
 	while(x!=-1)
 	{
 		p=new Node;
 		p->date=x;
 		p->next=NULL;
 		r->next=p;//把新结点连接到前面的链表中
		r=p;
		cin>>x; 
	 }
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	 
	 
	 // 单链表的查找 
	 p=head->next;
	 int i=0;
	 while(p->next!=NULL)
	 {
	 	if(p->date==3)
	 	{
	 		i++;
		 }
		 p=p->next;
		 
	  } 
	  cout<<"其中数据为3的个数有"<<i<<"个"<<endl; 
	 
 	return 0;
 }
 
 
 
 

单链表的插入

#include <iostream>
 using namespace std;
 struct Node
 {
 	int date;
 	Node *next;
 };
 Node *head,*p,*r;
 int x;
 
 void insert(Node *head,int i,int x)//在第i个位置插入x
 {
 	Node *p,*s;
	int j;
 	p=head;
 	j=0;
 	while((p!=NULL)&&(j<i-1))
 	{
 		p=p->next;
 		j=j+1;
	 }
	 if(p==NULL)
	 cout<<"没有这个位置"<<endl;
	 else 
	 {
	 	s=new Node;
	 	s->date = x;
	 	s->next = p->next;
	 	p->next = s;
	  } 
  } 
 
 int main()
 {
 	cin>>x;
 	head=new Node;//申请头结点 
 	r=head;
 	while(x!=-1)
 	{
 		p=new Node;
 		p->date=x;
 		p->next=NULL;
 		r->next=p;//把新结点连接到前面的链表中
		r=p;
		cin>>x; 
	 }
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	  insert(head,2,99);
	  p=head->next;// 重置 p 以从头开始遍历  
	   while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	 return 0;
 }
 
 
 
 

单链表的删除

#include <iostream>
 using namespace std;
 struct Node
 {
 	int date;
 	Node *next;
 };
 
 Node *head,*p,*r;
 int x;
 
void insert(Node *head,int i,int x)//在第i个位置插入x
{
  	Node *p,*s;
	int j;
 	p=head;
 	j=0;
 	while((p!=NULL)&&(j<i-1))
 	{
 		p=p->next;
 		j=j+1;
	 }
	 if(p==NULL)
	 cout<<"没有这个位置"<<endl;
	 else 
	 {
	 	s=new Node;
	 	s->date = x;
	 	s->next = p->next;
	 	p->next = s;
	  } 
  } 

void del(Node *head,int i)
 {
	Node *p,*s;int j;
	p=head;
	j=0;
	while((p!=NULL)&&(j<i-1))
	{
		p=p->next;
		j=j+1;
	}
	if(p==NULL)
	cout<<"没有这个位置"<<endl;
	else{
		s=p->next;
		p->next=p->next->next;
		delete s;
	} 
 }

 	int main()
 {
 	cin>>x;
 	head=new Node;//申请头结点 
 	r=head;
 	while(x!=-1)
 	{
 		p=new Node;
 		p->date=x;
 		p->next=NULL;
 		r->next=p;//把新结点连接到前面的链表中
		r=p;
		cin>>x; 
	 }
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	  insert(head,2,99);
	  p=head->next;
	   while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	 
	 del(head,2);//删除第二个结点 
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	 

	 
 	return 0;
 }
 
 
 
 
#include <iostream>
 using namespace std;
 struct Node
 {
 	int date;
 	Node *next;
 };
 
 Node *head,*p,*r;
 int x;
 
void insert(Node *head,int i,int x)//在第i个位置插入x
{
  	Node *p,*s;
	int j;
 	p=head;
 	j=0;
 	while((p!=NULL)&&(j<i-1))
 	{
 		p=p->next;
 		j=j+1;
	 }
	 if(p==NULL)
	 cout<<"没有这个位置"<<endl;
	 else 
	 {
	 	s=new Node;
	 	s->date = x;
	 	s->next = p->next;
	 	p->next = s;
	  } 
  } 

void del(Node *head,int i)
 {
	Node *p,*s;int j;
	p=head;
	j=0;
	while((p!=NULL)&&(j<i-1))
	{
		p=p->next;
		j=j+1;
	}
	if(p==NULL)
	cout<<"没有这个位置"<<endl;
	else{
    s = p->next; // 保存要删除的节点  
    p->next = s->next; // 绕过要删除的节点  
    delete s; // 删除节点 
	} 
 }

 	int main()
 {
 	cin>>x;
 	head=new Node;//申请头结点 
 	r=head;
 	while(x!=-1)
 	{
 		p=new Node;
 		p->date=x;
 		p->next=NULL;
 		r->next=p;//把新结点连接到前面的链表中
		r=p;
		cin>>x; 
	 }
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	  insert(head,2,99);
	  p=head->next;
	   while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	 
	 del(head,2);//删除第二个结点 
	 p=head->next;
	 while (p->next!=NULL)
	 {
	 	cout<<p->date<<" ";
	 	p=p->next;
	 }
	 cout<<p->date<<endl;
	 

	 
 	return 0;
 }
 
 
 
 

注意看del函数中删除s结点的操作,不同的方法

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值