在学习链表之前,希望大家对指针和结构体有一定的认识。因为链表是由指针和结构体构成的。
链表是一种基本的数据结构。是动态分配内存的。它的作用是用来存储数据的。链表在使用前不需要知道存储数据的个数,因为它是根据需要开辟内存单元的。链表中的每一个元素称为结点。每个结点分为两部分,<1>用户需要的实际数据。(数据域)<2>下一个结点的地址(指针域)。链表有表头和表尾,在使用之前表头为空,在使用后表尾指向空。下面是一个简单的链表,大家可以看一下。
#include<iostream>
#include<stdlib.h> //提供malloc函数
using namespace std;
struct student
{
int num; //用户存储的数据 ,数据域
struct student *next; //指向下一个结点的指针 ,指针域
};
int main()
{
struct student *head=NULL,*p,*q; //head为头指针,开始时头指针为空 ,若是头指针不为空,编译不会报错,但无法运行。
int i;
for(i=0;i<2;i++)
{
p=(struct student*)malloc(sizeof(struct student)); /*开辟空间,要注意此时空间是开辟在堆上,需要用户自己释放*/
cin>>p->num; //输入数据
if(head==NULL)
{
head=p;
}
else
{
q->next=p;
}
q=p;
}
q->next=NULL; //尾指针要指向空
p=head;
while(p!=NULL) //遍历
{
cout<<p->num<<endl;
p=p->next;
}
while(head!=NULL) //释放
{
p=head;
head=head->next;
free(p); //释放掉用户开辟的空间
}
return 0;
}
这个例子是用malloc函数开辟空间,c和c++均可使用。而用new开辟空间的方式只适用于c++,不适用于c。