源码:
/*
先创建一个单向链表,然后从头结点开始逐个删除。
*/
#include"stdio.h"
#include"stdlib.h"
//声明一个结点,实际上就是定义一个数据结构
struct node{
int num;
node *next;
};
//创建链表
node *creatlist()
{
int i=0;//统计创建结点个数
node *head,*p2,*p1;//p2用来传递结点指针
head=p2=p1=new node;
printf("请输入头结点数据域数据:nr");
scanf("%d",&p1->num);
p1->next=NULL;
while(p1->num!=0)
{
p1=new node;
scanf("%d",&p1->num);
p2->next=p1;//头结点指针指向新创建的结点
p2=p1;
i++;
}
p2->next=NULL;//链表尾结点
printf("创建的结点数是:%dn",i);
return head;
}
void display(node *head)
{
node *p=head;
while(p->next!=NULL)
{
printf("%dt",p->num);
p=p->next;
}
printf("n");
}
//从头结点开始删除整个链表
void remove(node *head)
{
int i=0;//统计删除结点个数
//通过这两个指针的移动实现整个链表结点逐个删除,
node *p,*p1;//也就是说本函数只需轮流使用这两个指针移动就能实现遍历链表
p=head;//存储头指针,
p1=p->next; //存储头结点指针域
while(p->next!=NULL)//通过循环逐个删除结点
{
//刚开始p指向head,即p存储了头结点head本身的指针,即p就是头结点指针
delete p;//通过这一步释放p所指向的内容,即删除头结点内容
i++;
p=p1;//p指向p1即下一个结点,这时p1成为新链表的头指针,因为之前的头结点已经删除
//p1原来指向头结点的下一个结点
p1=p1->next;//通过此步,p1指针重新指向,指向下一个结点实现指针移动
}
delete p;//将最后一个结点删除
printf("删除结点个数: %dn",i);
}
void main()
{
node*head=creatlist();
display(head);
remove(head);
}
--------------GKXW