一般的数组存在着以下的问题:1.元素类型一致。2.数组大小固定。所以便有了链表。链表可以理解为,可实时控制大小的一种数组。
数组拓展:1.搬迁=>可以自己进行实现,c语言默认不支持。2.外扩->基于合理的思路,化整为零的思想,向外开拓新的内存。
链表:解释为由锁链相接的表,锁链指的是一种链接方式,表示一个个节点用于保存数据。C语言中链接两个内存的方式,无法是使用指针。
链表的若干个节点,结构相同,节点由有效信息和无效信息两个部分组成。有效信息:用于存储数据的部分。无效信息:用于指向下一个或上一个节点的信息。可见有效和无效是相对使用者而言的。
链表,就是用于解决数组不能动态拓展的问题,但是数组依然比链表具有优势,因为使用起来更加方便。
列举一个单向列表:
struct node
{
int data;
struct node *pnext;
}
其中data为有效数据,*pnext为指向下一个节点的指针。一般情况下,链表会放在堆上进行存放,因为栈的不好管理,不好释放,且不能使用数据段,数据段在开始时就被分配了。所以链表只能使用堆内存。
int main()
{
struct node *p0=(struct node*)malloc(sizeof(struct node));
if(NULL==p0)
{
内存申请成功判段
}
...
bzero(p0,(struct node)); 清理内存,先清理再赋值
}
节点填充:
p0->data=1;
p0->pnext=NULL;下一个节点暂未被申请
链表的头指针,只是一个指针,类型为struct node *,占4字节,没有data数据,只是一个用于指向第一个节点的指针。
struct node *pHeader=NULL;
pHeader = p0;
所以申请第二个节点的方式为:
struct node *p1=(struct node*)malloc(sizeof(struct node));
if(NULL==p1)
{
内存申请成功判段
}
...
bzero(p0,(struct node)); 清理内存同memset()
p1->data=2;
p1->pnext=NULL;
P0->pnext=p1;
后面的节点申请方式同上。
下一章将对单链表的封装与插入进行说明。