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