1.结构体
链表是一种常见的数据结构,主要由若干个结点构成,结点包含一些数据信息及下一个结点的地址。分析可知结点中各成员的数据类型是不同的,声明一个结构体类型将不同类型的数据组合起来,这样每一个结点都可以看成是一个结构体变量。简单举例、代码如下:将一个整型和结构体指针类型组合形成的结构体类型。
struct Person //声明一个结构体类型struct Person
{
int num; //整型变量num,用于存放结点信息
struct Person *next; //结构体指针next,用于存放下一结点地址
};
2.创建动态链表
动态链表的创建需要利用malloc()、calloc()函数进行动态的内存分配。代码如下:
struct Person *p1,*p2,*head; //定义结构体指针
p2=p1=(struct Person *)malloc(sizeof(struct Person));
//动态分配了sizeof(struct Person)大小的空间,用结构体指针p指向该分配区域的开头位置。
若将此结点作为头结点,继续用动态分配函数开辟结点,用上一个结点的结构体指针成员指向新开辟的结点地址;当最后一个结点建好后,只需令最后一个结点的结构体指针成员指向NULL,即可完成链表创建。
if(n==1) head=p1;//如果是第一个结点,就用头指针指向该结点。
else p2->next=p1;//如果不是,就将当前链表的nest成员指向新开辟的结点。
3.动态链表插入结点
1.先动态开辟一个结点,写入相关数据信息。
struct Person *p;//定义结构体指针
p=(struct Person *)malloc(struct Person);//动态开辟一个sizeof(struct Person)大小的空间
scanf("%d",&(p->num));//新开辟结点中写入数据信息
2.定义两个结构体指针变量指向链表的表头。定义两个整型变量,一个用于循环移动结构体指针指向,一个用于输入插入结点的位置。
struct Person *p1,*p2;
p2=p1=head;
int i,j;
3.判断要插入结点的位置:
<1>插入表头位置:
p->next=head;//新结点成员next指向原来的表头。
head=p; //头指针指向新结点。
<2>插入表尾位置:
for(j=1;j<n;j++) p1=p1->next;//利用循环使p1指向原链表最后一个结点。
p1->next=p; //原表尾成员next指向新开辟的结点p。
p->next=NULL; //将NULL赋给新开辟的结点成员next,使新结点成为新的表尾结点。
<3>插入其他位置:
for(j=1;j<i-1;j++) p2=p1=p1->next;//利用循环使p1、p2指向目标位置的前一个结点。
p2=p2->next; //p2指向原目标位置的结点。
p1->next=p; //p1指向的结点成员next指向新开辟的结点。
p->next=p2; //新开辟的结点成员next指向原目标位置的结点。
4.动态链表删除结点
1.定义两个结构体指针变量指向链表的表头。定义两个整型变量,一个用于循环移动结构体指针指向,一个用于输入删除目标结点的位置。
struct Person *p,*p1;
p1=p=head;
int i,j;
2.判断要删除目标结点的位置:
<1>删除表头结点:
head=head->next;//将头指针指向原链表第二个结点。
p->next=NULL; //原头结点成员next置空。
<2>删除表尾结点:
for(j=1;j<n-1;j++) p=p->next;//利用循环,移动结构体指针变量p,使其指向倒数第二个结点。
p->next=NULL; //将NULL赋给倒数第二个结点成员next,使当前结点成为表尾结点。
<3>删除其他结点:
for(j=1;j<i-1;j++) p1=p=p->next;//利用循环,将结构指针p、p1移动至目标结点的前一个结点。
p1=p1->next; //p1指向要删除的结点。
p->next=p1->next; //前一个结点的结构体成员next,跳过删除的结点指向下个结点。
p1->next=NULL; //将NULL赋给要删除的结点成员next。
4.输出链表
struct Person *p;//定义结构体指针p。
p=head; //结构体指针p指向头指针。
if(p!=NULL) //如果链表不为空。
do
{
printf("%d ",p->num);//输出当前结点成员num。
p=p->next; //p指向下一结点。
}while(p!=NULL); //当p=NULL输出完成。
5.程序运行结果
了解以上链表的创建、输出,结点的插入、删除相关操作后。利用模块化编程,按功能编写函数,主函数调用这些函数模块,完成链表的相关操作。
https://item.taobao.com/item.htm?id=827303984397