什么是静态数据结构?
我们在程序里大多使用的是静态数据结构,比如说整型、浮点型、数组,它们的特点是由系统分配,固定大小的存储空间。在之后程序运行时,它的空间位置以及容量都不会再改变。
但当我们不确定一个东西的存储空间时应该如何处理?
这时我们就需要用到动态数据结构。
链表:
首先链表需要有一个头指针变量(即head),head存放了一个地址,这个地址指向了链表里的第一个元素(A)。
链表里的每个元素都是一个节点,每个节点包含了两部分(当前节点存储的数据以及下一个节点的地址)。
由上图我们可以看出T节点为最后一个节点,所以它的地址存储为空(null)。
注意到链表里的各个元素的地址不一定是连续的,这与数组的存储地址方式有所区别。
如果我们想访问B元素里的数据,就必须通过其上一个节点(A)提供的B的地址,才能访问到B。并且如果没有头指针,整个链表同理也是无法访问的。
下面我们来写一个静态链表:
1.首先写一个结构体类型来作为节点元素:
struct weapon{
int atk;
int price;
struct weapon * next;
};
这里边有三个成员,攻击力(atk)、价格(price)以及struct weapon类型的指针变量(next),该指针变量用来存放下一个节点的地址。
2.现在定义三个weapon的结构体变量作为节点以及头指针head:
struct weapon a,b,c,*head;
3.接下来对三个weapon结构体成员进行赋值操作:
a.atk = 100;
a.price = 100;
b.atk = 200;
b.price = 200;
c.atk = 300;
c.price = 300;
4.将三个节点连成一个链表:
head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
5.打印链表里各个元素的值:
struct weapon *p;
p = head;
while(p != NULL){
printf("%d %d ",p->atk,p->price);
p = p->next;
}
其中“struct weapon *p”表示借助指针p去访问节点。
6.完整代码如下:
#include<stdio.h>
struct weapon{
int atk;
int price;
struct weapon * next;
};
int main()
{
struct weapon a,b,c,*head;
a.atk = 100;
a.price = 100;
b.atk = 200;
b.price = 200;
c.atk = 300;
c.price = 300;
head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
struct weapon *p;
p = head;
while(p != NULL){
printf("%d %d ",p->atk,p->price);
p = p->next;
}
return 0;
}
7.运行结果: