一.链表基本概念
- 链表是一种常见的数据结构,它通过指针将一系列数据结点,连接成一个数据链。相对于数组,链表具有更好的动态性。
- 数据域用来存储数据,指针域用来建立与下一个结点的联系,保存下一个结点的地址。
- 建立链表时无需预先知道数据总量的,可以随机分配空间,可以高效的在链表中的任意位置实时插入或删除数据。
- 链表的开销,主要是访问顺序性和组织链的空间损失。
- 链表在内存中是非连续的。
二.数组和链表的区别
数组:一次性分配一块连续的存储区域
优点:随机访问元素效率高
缺点:一次性分配一块连续的存储区域;
删除和插入某个元素的效率低;
链表:无需一次性分配一块连续的存储区域,只需分配n块结点存储区域,通过指针建立关系。
优点:删除和插入某个元素的效率高
缺点:随机访问元素效率低
链表的插入:
void insert_linklist(struct linknode*header,int oldval,int newnal)
{
if(NULL==header)
{
return;
}
//两个辅助指针变量
struct linknode*pprev=header;
struct linknode*pc=prev->next;
while(pc!=NULL)
{
if(pc->data==oldval)
{
break;
}
pprev=pc;
pc=pc->next;
}
if(pc==NULL)//说明链表中不存在oldval的节点
{
return;
}
//先创建新节点
struct linknode*newnode=malloc(sizeof(struct linknode));
newnode->data=newval;
newnode->next=NULL;
//新节点插入到链表中
newnode->next=pc;
pprev->next=newnode;
}
链表的遍历:
//链表的遍历打印
void foreach_linklist(struct linknode*header)
{
if(NULL==header)
{
return;
}
//辅助指针变量
struct linknode*pc=header->next;
while(pc!=NULL)
{
printf("%d",pc->data);
pc=pc->next;
}
}