为什么要使用链表
为了更好的理解链表,下面我对链表的讲解将对比数组进行。
数组它不香吗?
1、 在对数组中的数据进行插入,删除操作时,往往需要改动目标位置后的所有数据,工作量大且繁琐。
2、 数组对内存要求高,创建数组时必须事先固定数组大小,容易造成内存浪费和数组越界。
这个时候引入链表,就可以很好的解决上述问题。
链表
链表实际上是线性表的链式存储结构,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的
优点:
1、插入删除的效率高
2、动态分配内存,内存利用率高,扩展灵活
缺点:
查找的效率低,随机访问性不强。
下面的表格可以让我们更直观的感受链表的优缺点
链表分类
(以下图片来源网络)
- 单链表
- 双向链表
- 循环链表
单向链表
- 定义链表
struct node
{
typename data;//数据域
node* next;//指针域
};
- 创建链表
node* create(int Array[],int n)
{
node *p,*pre,*head;//p 当前结点 pre 当前结点的上一结点 head 头结点
head=new node; //创建头结点
head->next=NULL;
pre=head;
for(int i=0;i<n;i++)
{
p=new node;
p->data=Array[i];
p->next=NULL; //指针域结尾为NULL
pre->next=p;
pre=p;
}
return head;
}
- 查找元素
int search(node* head,int x)
{
int count=0;//计数
node* p=head->next;//从头结点开始,头结点下一结点有数据
while(p!=NULL)//只要没到链表末尾
{
if(p->data==x)
count++;
p=p->next;
}
return count;
}
- 插入元素
void