首先要知道的是销毁即把表头的空间都释放了
清空就是表头还在,之后还可以创建新的结点
首先,我们定义一个结点类型
typedef struct LNode
{
int data;
struct LNode* next;
}LNode,*LinkList;//LinkList是LNode*的别名
在main中需要创一个结点变量L作为头结点再生成链表(这个'L‘将会作为实参传到函数中)
int main() { LinkList L; ...//下面的内容暂时省略,之后再会提到 }
然后,我们生成一个空链表L
void Init_L(LinkList &L,)//这里的'&'是用了C++语法的引用类型,能使实参随形参一同变化
{
L=new LNode;//使头指针L指向新增的空间,这个空间在链表中被称为结点//给结点变量L分配一个LNode类型的空间(LNode即为L的数据类型但需要给L分配一个空间以使L成为拥有数据域和指针域的组成链表的元素————结点)
L->next=NULL;空表的特征就是头结点的指针域为空
}
为了能由对象(我们操作者)自己决定新增结点数,我们需要在调用创建结点的函数之前先定义一个整型变量n并手动(在控制器中输入我们想要的n的值)
int main() { L=new LNode; int n; printf("请输入想创建结点的数量:"); scanf("%d",&n); }
接下来我们要开始新增结点(用来组建链表)了
void Creat(LInkList L,int n)//n是要新建结点的个数,在主函数中我们可以自行输入//注意哈,函数名的首字母不一定要大写的,我大写纯粹是为了美观好看/
{
LinkList p;
int i;
for(i=0;i<n;i++)
{
p=new LNode;//和生成头结点时一样,为结点变量分配一个空间便是新增了一个结点
printf("请给data填入相应类型的数据:");
scanf("%d",&p->data); p=L->next; L-next=p;
}
}
我明白了,p和L只是一个指针,P=new LNode;即使指针p(在链表中称作指针变量)指向一个新增的空间,这个空间叫做结点,其中由两个域,一个是数据域,一个是指针域。
同步一下,在main()里面调用我们的函数吧~
int main()
{
LinkList L;//创建头指针
int n;
printf("请输入想要创建结点的个数:") ;
scanf("%d",&n);
Init_L(L);//创建头结点并使其指针域为空,即创建一个空表
Creat(L,n);
}
哇趣,我知道老师为什么要分别用两个函数,不直接在一个函数进行空链表的创建和结点的生成了,因为这样呢个让我们更加清楚的理解每一点并在定义和使用这两个函数的过程中更好去解释一些操作细节和各操作的用处,使我们的对各操作的理解清晰化,从而更好地去形成一个网络。
接下来由于new和delete作为C++中特有的标识符(注意不是函数噢)
new分配的空间会一直在那,很占内存(那这么说,岂不是我用了new而不用delete我下一次运行代码时,我的代码之前分配的位置就找不到了,然后分配给新数据的是新的空间了?这一点我还不是很懂)
于是通常推荐new和delete都用,这样就不会因为这个而有啥存储空间上的隐患了~
于是我们就会用到delete进行链表的销毁:
int destroy(LinkList& L)//话说要是这里不加 & 那岂不是销毁了个寂寞? //既然不是像顺序表那样用数组,便除了创建结点时为了灵活性要有个n来决定创建几个结点以外,就不需要像顺序表那样需要n再创建一个i=0来遍历了,指针有指针遍历的办法
{
LinkList p;
p = new LNode;
while (L) //因为不管头插尾插都是最后一个结点的指针域封底(为空),当L==NULL时也就是把链表L的所有内容和空间释放完毕了
{
p = L;
L = L->next;
delete p;
}
} //可是这销毁了,感觉表还在呀?就是只剩已个空表了,难道这就叫把表销毁了吗?不不不,空表都不剩了,因为是从头结点开始吧销毁的,空表的特征是:头肩底的指针域为空
//话说要是这里不加 & 那岂不是销毁了个寂寞? //既然不是像顺序表那样用数组,便除了创建结点时为了灵活性要有个n来决定创建几个结点以外,就不需要像顺序表那样需要n再创建一个i=0来遍历了,指针有指针遍历的办法
//因为不管头插尾插都是最后一个结点的指针域封底(为空),当L==NULL时也就是把链表L的所有内容和空间释放完毕了
// 可是这销毁了,感觉表还在呀?就是只剩已个空表了,难道这就叫把表销毁了吗?不不不,空表都不剩了,因为是从头结点开始吧销毁的,空表的特征是:头肩底的指针域为空
清空则是这样的:
void clean(LinkList &L)
{
LinkList p,q;
p=L->next;//注意这里就不是p=L了
while(p)//注意这里不是while(L)了
{
q=p; //注意,这里p就担任着后移的工作,q担任着存地址然后让delete释放地址中内容对应空间的工作
p=p->next;
delete q;
}
}
为了更好地拿代码去用,把我提供的代码串都排好版了~
加油!!!