3链表
链表是由许多相同数据类型的数据项按照特定书序排列而成的线性表。但链表的特性是其各个数据项在计算机内存中的位置是不连续且随机存放的,其优点是数据的插入或删除都相当方便,有新数据加入就向系统申请一块内存空间,而数据被删除后,就可以把这块内存空间还给系统,加入和删除都不需要移动大量的数据。缺点就是设计数据结构时较为麻烦,在查找数据时,也无法像静态数据那样可随机读取数据,必须按序查找到该数据为止。
3.1动态分配内存
让内存运用更具弹性,在程序执行期间,按照用户的设置与需求,再分配所需要的变量内存空间。
在C语言中,malloc()与free()函数在程序执行期间动态分配与释放内存空间,定义于头文件stdlib.h头文件中。
动态内存的分配:
数据类型*指针名称=(数据类型*)malloc(sizeof(数据类型)*n);
动态分配内存之后,需要释放,否则会产生内存漏失。释放动态内存如下:
free(指针名称);
例:piVal=(int*)malloc(sizeof(int));
free(piVal);
C++中的动态分配变量
动态分配内存必须使用new关键词来获取内存地址,声明方式如下:
数据类型 *指针名称=new 数据类型;
或
数据类型 *指针名称=new书类型(初值);
释放内存使用:
delete 指针名称;
3.2单向链表
一般单向链表主要有两部分构成:数据字段指向下一个元素的内存位置的指针。
在单向链表中第一个节点是”链表头指针“;指向最后一个节点的指针设为null。
单向链表的建立
程序上必须设计一下4个步骤:
- 动态分配内存空间给新节点使用。
- 将原链表尾部的指针指向新元素所在的内存位置。
- 将ptr指针指向新节点的内存位置,表示这是新的链表尾部。
- 由于新节点当前为链表的为后一个元素,所以将它的指针指向null。
遍历单向链表
ptr =head;
while(ptr->next!=null)
{
head =head->next;
ptr = head;
}
释放单向链表节点空间
while(first!=null)
{
ptr=first;
first = first-next;
free(ptr);
}
单向链表插入新节点
插入首位:
newnode->next =first;
first = newnode;
插入最后:
ptr->next =newnode;
newnode->next =null;
插入中间:
newnode->next=x->next;
x->next=newnode;
单向链表删除节点
删除首位节点:
top = head;
head = head->next;
free(top);
删除尾部节点:
ptr->next = tail;
ptr->nezt = null;
free(tao;);
删除中间节点:
Y= ptr ->next;
ptr->next = Y->next;
free(Y);
3.3环形链表
环形链表是将最后一个节点指针指向链表头部,而不是指向null;
在环形链表中任何一个节点,都可以到达此链表内的其他各个节点。
3.4双向链表
将两个方向不同的链表结合起来,除了存放数据的字段以外,它有两个指针变量,其中一个指针指向后面的节点,另一个则指向前面的节点,这样的链表被称为双向链表。
参考文献:
胡昭民著《图解数据结构》第二版