结构体指针
结构体指针的定义和操作
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结点的操作,不同的方法