#define NULL 0
struct student
{
long num;
float score;
struct student *next;
};
main()
{
struct student a, b, c, *head, *p;
a.num=99101; a.score=89.5;
b. num=99103; b.score=90;
c.num=99107 ; c.score=85;
head=&a; a.next=&b; b.next=&c; c.next=NULL;p=head;
do
{ printf("%ld %5.1f\n",p->num,p->score);
p=p->next; }while(p!=NULL); }
1.为什么在结构体内,结构体student 还没有定义好,而就在其内部使用呢?不是说先定义后使用的吗?”这时student这个类型可以使用,但是个不完全类型,只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用.就是说next指向了struct student 类型的对象,但是具体只想谁并不知道。
2.struct student a, b, c, *head, *p 都是struct的具体对象,而next是struct的一个成员变量,next的类型是指向struct student结构体的指针型变量。
3.指针对象指向成员时使用->:p->num,p->score,p->next
4.普通对象指向成员时使用,: a.next,a.num,a.score
3.因为next存放的是下一个对象的地址,p->next 是 p 所指向的结构的 next 成员,存放的是下一个对象的地址。p=p->next,就让p指向了下一个结点的数据。
c++版本简单链表程序
整体思路是:1.定义类成员的类型指针class list *next
2.定义类型别名与指针型别名,使用别名参与运算
3.定义指向链表头的指针,与类成员指针同类型,为delptr
4.定义指向当前节点的指针ptr
5.定义新的节点newnode
6.new分配内存,node* delptr=new node,此时delptr指向链表头,并为成员赋值
7.ptr=delptr; //保留链表头指针,以ptr为指向当前节点的指针
8.创建新节点newnode,并分配内存,将此时newnode指向该节点,并为成员赋值
9.清空newnode的成员next中的指向 newnode->next=NULL,此时为孤立节点
10.建好头结点和孤立节点之后把孤立节点连接到链表后面ptr->next=newnode
11.ptr=ptr->next; //让ptr保持在链表的最后面,ptr->next里存放的是下一个对象的地址,赋值给ptr即将指向对象向前移动一位。
12.最后还需释放空间delete,避免发生内存泄漏。
#include <iostream>
using namespace std;
class list
{
public:
int num,score;
char name[10];
class list *next; //next指向了类list,next是一个指针,指向了另一个类实例,这样可以形成链表。
};
typedef class list node; //定义类型别名,将node定义为list的同义词
typedef node *link; /将link定义为node*的同义词,link指向node。
int main()
{
link newnode,ptr,delptr ; //声明三个链表结构的指针
cout<<"请输入 5 位学生的数据:"<<endl;
delptr=new node; //delptr暂当链表头指针https://blog.csdn.net/xxpresent/article/details/53024555
if (!delptr)
{
cout<<"[Error!!内存分配失败!]"<<endl;
exit(1);
}
cout<<"请输入座号:";
cin>>delptr->num;
cout<<"请输入姓名:";
cin>>delptr->name;
cout<<"请输入成绩:";
cin>>delptr->score;
ptr=delptr; //保留链表头指针,以ptr为指向当前节点的指针
for (int i=1;i<5;i++)
{
newnode=new node; //创建新节点
if(!newnode)
{
cout<<"[Error!!内存分配失败!"<<endl;
exit(1);
}
cout<<"请输入座号:";
cin>>newnode->num;
cout<<"请输入姓名:";
cin>>newnode->name;
cout<<"请输入成绩:";
cin>>newnode->score;
newnode->next=NULL;
ptr->next=newnode; //把新节点加在链表后面
ptr=ptr->next; //让ptr保持在链表的最后面
}
cout<<"\n 学 生 成 绩"<<endl;
cout<<" 座号\t姓名\t成绩\n====================="<<endl;
ptr=delptr; //让ptr回到链表头
while(ptr!=NULL)
{
cout<<ptr->num<<"\t"<<ptr->name<<"\t"<<ptr->score<<endl;
delptr=ptr;
ptr=ptr->next; //ptr按序往后遍历整个链表
delete delptr; //释放内存空间
}
system("pause");
}