当前位置: 首页 > news >正文

结构体指针

结构体指针的定义和操作

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结点的操作,不同的方法

 

 

 

 


http://www.mrgr.cn/news/27589.html

相关文章:

  • 缓存cache
  • vmware集群 vSAN HCL 数据库
  • Chrome 浏览器开启打印模式
  • C#界面设计
  • 51单片机应用开发(进阶)---定时器应用(电子时钟)
  • LeetCode 491-非递减子序列
  • 计算机专业毕业设计选题指南:避开这些坑,让你轻松毕业-附选题推荐(精选题目汇总大全)
  • 【leetcode】树形结构习题
  • 小阿轩yx-案例:Zabbix监控kubernetes云原生环境
  • 安全区域边界等保测评
  • 51单片机-系列-单片机基础知识入门流水灯
  • 1.使用 VSCode 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)
  • 6芯7芯可旋转电连接器航空插头
  • [进阶]面向对象之 包 final
  • redis windows安装包下载路径
  • Python实用的27个实例,涵盖从基础到进阶的所有领域!
  • 字典转换(根据字典转换、根据id转换)
  • 为什么黄酒不能成为主流?
  • Leetcode 验证回文串
  • AUTOSAR_EXP_ARAComAPI的5章笔记(6)
  • 【网络安全 | Java代码审计】JreCms代码审计
  • 【网络通信基础与实践第三讲】传输层协议概述包括UDP协议和TCP协议
  • PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field
  • 玩转springboot之为什么springboot可以直接执行
  • MySQl篇(基本介绍)(持续更新迭代)
  • 扣子智能体实战-汽车客服对话机器人(核心知识:知识库和卡片)