静态链表和动态链表是线性表链式结构的两张不同的表现方式。
1、静态链表是用类似于数组方法来实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间的大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。
2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。
一:所谓静态链表,是所有的节点都是在程序中定义好的,不是临时开辟的,也不能用完后释放。
具体代码参考如下:
#include <stdio.h>
/* 静态链表 */
struct node
{
int num;
struct node *next;
};
int main()
{
struct node stu[3];
struct node *head, *p;
stu[0].num = 10; //对结点的num成员赋值
stu[1].num = 20;
stu[2].num = 30;
head = &stu[0]; //头指针指向第1个结点stu[0]
stu[0].next = &stu[1]; //将结点stu[1]的地址赋值给stu[0]结点的next成员
stu[1].next = &stu[2]; //将结点stu[2]的地址赋值给stu[1]结点的next成员
stu[2].next = NULL; //stu[2]是最后一个结点,其next成员不存放任何结点的地址,置为NULL
//遍历静态链表
p = head; //使p指针也指向第1个结点
do{
printf("%d\n", p->num); //输出p所指向结点的数据
p = p->next; //然后让p指向下一个结点
} while (p != NULL); //直到p的next成员为NULL,即完成遍历
return 0;
}
二:动态链表是指在程序执行过程中,从无到有的建立起一个链表,即一个一个的开辟节点和输入各节点数据,并建立起前后联系。
具体参考代码如下:
#include <stdio.h>
#include <stdlib.h>
/*所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。*/
struct Student
{
int No; //学号
struct Student *next;
};
int main()
{
struct Student *p1, *p2;
struct Student *head, *p;
int n = 0; //结点个数
head = NULL;
p1 = (struct Student *)malloc(sizeof(struct Student));
printf("请输入第1个学号\n");
scanf("%d", &p1->No);
p2 = p1; //开始时,p1和p2均指向第1个结点
while (p1->No != 0)
{
n++;
if (n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;//p2是最后一个结点
printf("请输入学号,输入0终止:\n");
p1 = (struct Student *)malloc(sizeof(struct Student));
scanf("%d", &p1->No);
};
p2->next = NULL;//输入完毕后,p2->next为NULL
//遍历动态链表
p = head;
printf("\n学号为:\n");
while (p != NULL)
{
printf("%d\n", p->No);
p = p->next;
}
return 0;
}