C 单向链表之静态链表
一、链表的作用:实现了内存零碎数据的有效组织
比如下面总共有十个字节的空间,用了5个字节。这时我们用malloc来申请5个字节的空间,由于没有连续的内存,申请会失败,然而用链表这种数据结构来组织数据,就可以解决这类问题。
二、静态链表的实现
静态链表虽然没有太大作用,但对动态链表的理解很有帮助。链表的头和尾都好说,关键是节点的定义,节点定义如下:
typedef struct node
{
int data; //数据域:存储数据
struct node * next; //指针域:指向下一个节点
}Node;
可以将链表形象的用下图的小火车表示:
实现代码
#include<stdio.h>
typedef struct node
{
int data; //数据域:存储数据
struct node * next; //指针域:指向下一个节点(指向谁,就保存了谁的地址)
}Node;
int main()
{
Node a, b, c, d;
Node *head = &a;//头
a.data = 1;//数据
b.data = 2;
c.data = 3;
d.data = 4;
a.next = &b;//链接
b.next = &c;
c.next = &d;
d.next = NULL;//尾
Node *pHead = head;//访问
while (pHead)
{
printf("%d\n",pHead->data);
pHead = pHead->next;
}
return 0;
}
运行结果:
三、程序过程图分析
(1)为了方便书写,这里假设四个节点a,b,c,d的地址分别为0x10,0x20,0x30,0x40,head指向了a节点,保存了a的地址。
Node a, b, c, d;
Node *head = &a;//头
(2)写入数据
a.data = 1;//数据
b.data = 2;
c.data = 3;
d.data = 4;
(3)链接
a.next = &b;//链接
b.next = &c;
c.next = &d;
(4)尾
d.next = NULL;//尾
(5)访问
Node *pHead = head;//访问
1)第一次循环:
printf("%d\n",pHead->data);//打印1
pHead = pHead->next;//此时pHead保存的地址为0x20,指向b节点
2)第二次循环:
3)第三次循环
4)第四次循环,打印4,pHead=NULL。(所以不能用原来的head来访问,访问结束后,链表就没有头了)
5)跳出while()循环,访问结束。